跳转至

进程模型

来源:操作系统 / note/进程管理/进程/进程模型.md

进程模型就是操作系统用来描述和管理“正在运行的程序”的抽象模型。

简单说:

程序是静态的代码文件,进程是程序运行起来之后的动态实体。

菜谱和做菜的区别

程序就是一个既定的代码文件,进程可以理解成程序运行起来的一个实例

比如 qq.exe,它本身只是一个程序文件;当你双击运行它以后,操作系统就会创建一个 QQ 进程。


1. 为什么需要进程模型?

CPU 只有有限个核心,但电脑上可以同时开很多程序:

操作系统需要让它们看起来像是“同时运行”,所以要把每个运行中的程序抽象成一个独立单位,这个单位就是进程

操作系统通过进程模型来管理:

  • 谁正在运行?

  • 谁等待 CPU?

  • 谁在等待磁盘、键盘、网络?

  • 每个程序能访问哪些内存?

  • 一个程序崩溃会不会影响另一个程序?


2. 进程包含什么?

一个进程不只是代码,它通常包括:

进程 = 程序代码 + 数据 + 堆 + 栈 + CPU上下文 + 系统资源

更具体地说:

组成部分 含义
代码段 程序的机器指令
数据段 全局变量、静态变量
malloc/new 动态申请的内存
函数调用、局部变量、返回地址
CPU上下文 程序计数器 PC、寄存器等
打开的文件 文件描述符、文件指针
进程控制块 PCB 操作系统记录进程信息的数据结构

其中最重要的是 PCB,Process Control Block,进程控制块


3. PCB 是什么?

PCB 是操作系统为每个进程维护的一张“档案表”。

里面可能记录:

进程 ID:PID
进程状态:运行、就绪、阻塞
程序计数器 PC
寄存器内容
内存信息
打开的文件
优先级
父进程 ID
CPU 使用时间

操作系统靠 PCB 来管理进程。

比如进程 A 正在运行,突然时间片到了,操作系统要切换到进程 B。它会先把 A 当前的寄存器、PC 等信息保存到 A 的 PCB 中,然后从 B 的 PCB 中恢复 B 的运行状态。

这个过程叫做上下文切换


4. 进程的基本状态

经典进程模型里,进程通常有三种基本状态:

就绪态 Ready
运行态 Running
阻塞态 Blocked

就绪态

进程已经准备好了,只差 CPU。

比如:

程序已经加载到内存
资源也准备好了
但 CPU 正在运行别的进程

这时它处于就绪态


运行态

进程正在 CPU 上执行。

CPU 当前正在执行这个进程的指令

这就是运行态


阻塞态

进程暂时不能继续执行,必须等待某个事件。

比如:

  • 等待用户输入

  • 等待磁盘读取完成

  • 等待网络数据返回

  • 等待锁释放

  • 等待子进程结束

这时即使 CPU 空着,它也不能运行,因为它等的条件还没满足。


5. 三状态模型图

可以理解成这样:

        调度
 就绪 --------> 运行
  ^             |
  |             | 等待I/O、等待事件
  |             v
  +---------- 阻塞
      事件完成

更完整一点:

就绪态 --被调度--> 运行态
运行态 --时间片到--> 就绪态
运行态 --等待I/O--> 阻塞态
阻塞态 --I/O完成--> 就绪态

注意:

阻塞态不能直接变成运行态,一般要先回到就绪态,再由调度器分配 CPU。


6. 进程模型的核心思想

进程模型的核心是:

操作系统把每个正在运行的程序看成一个独立的“虚拟 CPU + 虚拟内存 + 资源集合”。

也就是说,每个进程都好像自己独占一台计算机:

  • 它以为自己有完整的地址空间;

  • 它以为自己能连续执行;

  • 它以为自己的文件、栈、堆是独立的。

但实际上:

  • CPU 是多个进程轮流使用的;

  • 内存由操作系统隔离;

  • 文件和设备由内核统一管理。


7. 进程和程序的区别

对比 程序 进程
状态 静态 动态
本质 文件、代码 程序的一次执行
是否占 CPU 不占 可能占
是否有生命周期 没有明显生命周期 有创建、运行、结束
数量关系 一个程序 可以对应多个进程

例如你打开两个 Chrome 窗口,可能会有多个 Chrome 进程。


8. 进程和线程的区别

简单说:

进程是资源分配的基本单位,线程是 CPU 调度的基本单位。

一个进程可以包含多个线程。

比如浏览器进程里面可能有:

  • 页面渲染线程

  • 网络请求线程

  • JavaScript 执行线程

  • UI 线程

进程之间资源隔离比较强,而同一个进程内的线程共享内存空间。


9. 放到你的 miniFS 实验里理解

你之前写的文件系统里有类似:

open 0 1.txt w
open 1 1.txt r

这里的 01 就可以理解成不同的进程 ID。

比如:

pid = 0 的进程打开 1.txt 写
pid = 1 的进程想打开 1.txt 读

你的代码中可能有:

writer_pid
reader_count

这就是在模拟操作系统对多个进程访问文件的管理。

如果某个文件正在被一个进程写:

writer_pid = 0

那么另一个进程读或写可能被拒绝,避免读到一半写入、数据不一致。

这其实就是进程模型里的资源管理问题。


一句话总结:

进程模型就是操作系统把正在运行的程序抽象成进程,并通过 PCB、状态转换、调度、资源管理等机制,让多个程序安全、有序地并发运行。