进程模型¶
来源:
操作系统 / note/进程管理/进程/进程模型.md
进程模型就是操作系统用来描述和管理“正在运行的程序”的抽象模型。
简单说:
程序是静态的代码文件,进程是程序运行起来之后的动态实体。
菜谱和做菜的区别
程序就是一个既定的代码文件,进程可以理解成程序运行起来的一个实例
比如 qq.exe,它本身只是一个程序文件;当你双击运行它以后,操作系统就会创建一个 QQ 进程。
1. 为什么需要进程模型?¶
CPU 只有有限个核心,但电脑上可以同时开很多程序:
操作系统需要让它们看起来像是“同时运行”,所以要把每个运行中的程序抽象成一个独立单位,这个单位就是进程。
操作系统通过进程模型来管理:
-
谁正在运行?
-
谁等待 CPU?
-
谁在等待磁盘、键盘、网络?
-
每个程序能访问哪些内存?
-
一个程序崩溃会不会影响另一个程序?
2. 进程包含什么?¶
一个进程不只是代码,它通常包括:
更具体地说:
| 组成部分 | 含义 |
|---|---|
| 代码段 | 程序的机器指令 |
| 数据段 | 全局变量、静态变量 |
| 堆 | malloc/new 动态申请的内存 |
| 栈 | 函数调用、局部变量、返回地址 |
| CPU上下文 | 程序计数器 PC、寄存器等 |
| 打开的文件 | 文件描述符、文件指针 |
| 进程控制块 PCB | 操作系统记录进程信息的数据结构 |
其中最重要的是 PCB,Process Control Block,进程控制块。
3. PCB 是什么?¶
PCB 是操作系统为每个进程维护的一张“档案表”。
里面可能记录:
操作系统靠 PCB 来管理进程。
比如进程 A 正在运行,突然时间片到了,操作系统要切换到进程 B。它会先把 A 当前的寄存器、PC 等信息保存到 A 的 PCB 中,然后从 B 的 PCB 中恢复 B 的运行状态。
这个过程叫做上下文切换。
4. 进程的基本状态¶
经典进程模型里,进程通常有三种基本状态:
就绪态¶
进程已经准备好了,只差 CPU。
比如:
这时它处于就绪态。
运行态¶
进程正在 CPU 上执行。
这就是运行态。
阻塞态¶
进程暂时不能继续执行,必须等待某个事件。
比如:
-
等待用户输入
-
等待磁盘读取完成
-
等待网络数据返回
-
等待锁释放
-
等待子进程结束
这时即使 CPU 空着,它也不能运行,因为它等的条件还没满足。
5. 三状态模型图¶
可以理解成这样:
更完整一点:
注意:
阻塞态不能直接变成运行态,一般要先回到就绪态,再由调度器分配 CPU。
6. 进程模型的核心思想¶
进程模型的核心是:
操作系统把每个正在运行的程序看成一个独立的“虚拟 CPU + 虚拟内存 + 资源集合”。
也就是说,每个进程都好像自己独占一台计算机:
-
它以为自己有完整的地址空间;
-
它以为自己能连续执行;
-
它以为自己的文件、栈、堆是独立的。
但实际上:
-
CPU 是多个进程轮流使用的;
-
内存由操作系统隔离;
-
文件和设备由内核统一管理。
7. 进程和程序的区别¶
| 对比 | 程序 | 进程 |
|---|---|---|
| 状态 | 静态 | 动态 |
| 本质 | 文件、代码 | 程序的一次执行 |
| 是否占 CPU | 不占 | 可能占 |
| 是否有生命周期 | 没有明显生命周期 | 有创建、运行、结束 |
| 数量关系 | 一个程序 | 可以对应多个进程 |
例如你打开两个 Chrome 窗口,可能会有多个 Chrome 进程。
8. 进程和线程的区别¶
简单说:
进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
一个进程可以包含多个线程。
比如浏览器进程里面可能有:
-
页面渲染线程
-
网络请求线程
-
JavaScript 执行线程
-
UI 线程
进程之间资源隔离比较强,而同一个进程内的线程共享内存空间。
9. 放到你的 miniFS 实验里理解¶
你之前写的文件系统里有类似:
这里的 0、1 就可以理解成不同的进程 ID。
比如:
你的代码中可能有:
这就是在模拟操作系统对多个进程访问文件的管理。
如果某个文件正在被一个进程写:
那么另一个进程读或写可能被拒绝,避免读到一半写入、数据不一致。
这其实就是进程模型里的资源管理问题。
一句话总结:
进程模型就是操作系统把正在运行的程序抽象成进程,并通过 PCB、状态转换、调度、资源管理等机制,让多个程序安全、有序地并发运行。