12 [虚拟化] 进程抽象;fork,execve,exit
南京大学操作系统课蒋炎岩老师网络课程笔记。
视频:https://www.bilibili.com/video/BV1N741177F5?p=12
讲义:http://jyywiki.cn/OS/2021/slides/8.slides#/
本讲概述
回到“操作系统是管理程序运行的软件”
- 操作系统中的进程
- 程序 = 状态机 (M,R)
- 操作系统 = 多个状态机
- 进程管理API
- fork:状态机的复制
- execve:状态机的重置
- exit
再次强调,一定要深入理解:程序(进程)就是一个状态机。
操作系统中的进程
复习:应用程序
应用程序 = 代码 + 数据(文件) = 状态机
- a.out, bash, ls ,grep
- gcc(cc1, as, collect2, ld)
- xedit, vscode
复习:操作系统
操作系统是管理多个应用程序执行的软件。
- 应用视角:操作系统就是一组系统调用
- 硬件视角:操作系统就是个状态机(C程序)
理解“最小”操作系统:
如果硬件提供一些机制(如虚拟存储来虚拟化内存M和寄存器R,即(M,R))使得各个“线程”不能访问其他“线程”、操作系统的内存,就得到了虚拟化的“进程”,仿佛独占CPU运行。注意:这里是将运行在操作系统上的各个程序(进程)看做了是运行在操作系统这个大程序(进程)上的一些”线程“。
操作系统:状态机的虚拟化
操作系统“模拟”了其中所有程序的状态机
- 这就是“虚拟化”
- 程序仿佛自己独占CPU运行,但它独占的只是CPU的一部分,其他部分它“看不见”。
进程:运行的程序。任意时刻,进程都可以看做是状态机的状态。
操作系统在终端以后,可以选择将进程(状态机)调度到CPU上运行。而进程执行系统调用,会使用指令(syscall)等回到操作系统。
“操作系统是一个中断处理程序”
- 被动的中断:硬件(时钟、I/O设备、NMI,)
- 主动的中断:系统调用
操作系统运行的两种模式
- 用户态(ring 3):应用程序运行在用户态
- 内核态(ring 0):操作系统运行在内核态
二者的切换如上面所述:
- 中断、系统调用:用户态 -> 内核态
- 操作系统调度:内核态 -> 用户态
就是这样的切换,使得我们的应用程序(在用户态)实现了虚拟化,同时操作系统仿佛就是一个中断处理程序。
操作系统课的三种调用
-
进程(状态机)管理
fork, execve, exit:进程(状态机)的创建、改变和删除
-
存储(地址空间)管理
mmap:对进程虚拟地址空间的一部分进行映射
brk:虚拟地址空间管理
-
文件(数据对象)管理
open, close:文件访问管理
read, write:数据管理
mkdir, link, unling:目录管理
fork() 状态机管理:创建状态机
如果需要创建状态机,我们需要什么样的API?
UNIX的答案:fork()
- 做一份状态机的完整的复制(内存M,寄存器现场R)
- 父进程返回子进程的PID,子进程返回0
fork bomb
fork bomb代码解析:
:(){
:|:&};: # 一行版本的fork bomb
:(){
# 格式化一下
: |

本文概述了操作系统中进程作为状态机的概念,重点讲解了fork、execve和exit三个关键API的作用:fork用于复制状态机,execve用于替换状态机,exit则用于终止状态机。通过实例和环境变量管理,展示了虚拟化过程如何通过硬件机制实现进程并发和隔离。

1659

被折叠的 条评论
为什么被折叠?



