| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 12 [虚拟化] 进程抽象;fork,execve,exit -> 正文阅读 |
|
[系统运维]12 [虚拟化] 进程抽象;fork,execve,exit |
12 [虚拟化] 进程抽象;fork,execve,exit南京大学操作系统课蒋炎岩老师网络课程笔记。
本讲概述回到“操作系统是管理程序运行的软件”
再次强调,一定要深入理解:程序(进程)就是一个状态机。 操作系统中的进程复习:应用程序应用程序 = 代码 + 数据(文件) = 状态机
复习:操作系统操作系统是管理多个应用程序执行的软件。
理解“最小”操作系统: 如果硬件提供一些机制(如虚拟存储来虚拟化内存M和寄存器R,即(M,R))使得各个“线程”不能访问其他“线程”、操作系统的内存,就得到了虚拟化的“进程”,仿佛独占CPU运行。注意:这里是将运行在操作系统上的各个程序(进程)看做了是运行在操作系统这个大程序(进程)上的一些”线程“。 操作系统:状态机的虚拟化操作系统“模拟”了其中所有程序的状态机
进程:运行的程序。任意时刻,进程都可以看做是状态机的状态。 操作系统在终端以后,可以选择将进程(状态机)调度到CPU上运行。而进程执行系统调用,会使用指令(syscall)等回到操作系统。 “操作系统是一个中断处理程序”
操作系统运行的两种模式
二者的切换如上面所述:
就是这样的切换,使得我们的应用程序(在用户态)实现了虚拟化,同时操作系统仿佛就是一个中断处理程序。 操作系统课的三种调用
fork() 状态机管理:创建状态机如果需要创建状态机,我们需要什么样的API? UNIX的答案:fork()
fork bombfork bomb代码解析:
父子进程、进程树因为状态机是复制的,因此总能找到”父子关系“。 因此有了进程树(pstree),如下:
进程树的存在,是我们用fork()复制创造子进程,所得到的一个很自然的结果。 例程1猜猜会打印出什么呢?(提示:可以试着画一下状态机,线程树)
例程2猜猜会打印出什么呢?
还是可以逐步画一下程序的状态机,
输出结果应该是6。 有趣的是,如果我们将输出重定向到管道,再通过 为什么会这样呢?这其实是因为printf函数将内容直接输出到标准输出stdout时是直接输出的,会按照我们的理解打印出6个Hello。但是如果要重定向到管道(或文本文件等),printf则会将要输出的内容先放置到缓冲区,到最后一起打印,在本例中,由于我们fork()创建进程的时候,会将全部的内存M和寄存器现场R复制一份,导致每次fork()时,缓冲区也被完整地复制,最后我们每个进程的缓冲区有2个Hello,最后共有四个进程,故会有8个Hello。(也可以重定向到文本文件中试一下,确实是有8个Hello)。这恰好进一步验证了我们所说的fork()是对整个(M,R)的完整复制。 可以尝试理解一下N=3时正常打印和重定向打印会有多少个Hello。笔者认为分别是 ∑ i = 1 N 2 i \sum_{i=1}^N2^i ∑i=1N?2i 和 2 N × N 2^N\times N 2N×N。 机器永远是对的,计算机系统的世界没有魔法,一切都是按部就班地进行的 execve() 状态机管理:替换状态机(执行)只有fork新建还不够,我们还需要能够执行别的程序。 UNIX的答案:execve execve(filename, argv, enpv)
这刚好对应了main函数的参数:
关于main函数的参数:Linux中 C++ main函数参数argc和argv含义及用法 execve可以看作状态机的重置。 环境变量环境变量即应用程序执行的环境。
PATH环境变量PATH环境变量是可执行文件的搜索路径 还记得gcc的strace结果吗
这个搜索顺序恰好是PATH环境变量中指定的顺序:
在gcc被execve时,将环境变量PATH传给gcc,它就会按照其顺序来搜索可执行文件的路径。 计算机系统里没有魔法,机器永远是对的 exit() 状态机管理:终止状态机有了fork,execve,我们可以自由地创建、执行程序(状态机)了,还缺一个销毁状态机的函数 UNIX的答案:exit
问题是一个进程(状态机)中有多个线程啊。 结束程序执行的三种方法exit的几种写法,它们是不同的:
最起码要区分好库函数(应用程序的一部分)和系统调用。 可以用strace观察各种结束方式的执行。 Fork-Exec vs. Spawn我们既然fork创建了一个子进程,那我们绝大多情况下肯定是要execve执行这个进程的,也就是说fork后面几乎一定会跟着execve,那为什么不直接把它们合成一个系统调用 spawn(path, argv, enpv) 呢?即spawn = fork + execve 实际上,fork + execve是一个非常优雅的实现,因为要考虑到进程可以持有操作系统中的对象,这使fork、execve、exit还要涉及到操作系统的对象的管理。 例如,在上面用到过的管道技术中:
其中 Take aways and Wrap-up虚拟化
Ref: http://jyywiki.cn/OS/2021/slides/8.slides#/ https://www.bilibili.com/video/BV1N741177F5?p=12 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 17:43:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |