进程是什么、有哪些状态、PCB 与进程控制怎么理解
进程管理这部分,最先要搞清楚的不是各种系统调用,而是:
什么是进程,操作系统为什么要管理进程,以及它到底是怎么管理的。
很多同学一开始会把进程理解成“一个正在运行的程序”,这句话本身没错,但还不够。面试里如果只答这一句,后面的状态、PCB、上下文切换就很难接上。
一、什么是进程
程序本身是磁盘上的静态文件,只有被装入内存并开始执行后,才会变成进程。
所以可以直接记成:
- 程序:静态的代码文件
- 进程:运行中的程序实例
但是进程不只是“代码在跑”。从操作系统角度看,一个进程通常还包含:
- 代码段
- 数据段
- 堆
- 栈
- 虚拟地址空间
- 页表等内存管理信息
- 打开的文件
- 调度状态
- CPU 执行现场
因此更完整的理解是:
进程是程序运行时形成的、带有独立资源和运行状态的执行实体。
二、为什么需要进程
因为 CPU 很贵,而磁盘、网络、外设都很慢。
如果一个程序发起磁盘 IO 后,CPU 只能傻等它,那 CPU 利用率会很低。操作系统为了提高效率,就会在一个进程等待 IO 时切换去执行另一个进程。
所以进程机制的本质意义是:
- 管理多个正在运行的程序
- 让 CPU 在多个任务之间切换
- 提高系统整体资源利用率
三、进程的状态
最经典的三状态模型包括:
1. 就绪态(Ready)
表示进程已经具备运行条件,只差 CPU。
2. 运行态(Running)
表示进程当前正在 CPU 上执行。
3. 阻塞态(Blocked / Waiting)
表示进程当前不能继续执行,在等待某个事件,比如:
- 磁盘 IO
- 网络数据
- 锁
- 子进程结束
- 定时器超时
这三种状态里最容易混的是就绪和阻塞,它们最本质的区别是:
就绪态是“能运行,只差 CPU”;阻塞态是“不能运行,在等条件”。
如果进一步细分,还常常会加上:
- 新建态(New)
- 终止态(Terminated)
- 挂起态(Suspended)
但面试里最核心的还是:就绪、运行、阻塞。
四、什么是 PCB
PCB 全称是 Process Control Block,也就是进程控制块。
你可以把它理解成:
操作系统给每个进程建立的一份“档案”。
如果没有 PCB,操作系统就不知道:
- 这个进程是谁
- 它现在是什么状态
- 上次执行到哪了
- 它有哪些资源
- 页表在哪里
- 该怎么调度它
所以 PCB 的本质作用是:
让操作系统能够识别、管理和调度每一个进程。
PCB 里通常包含什么
常见内容包括:
- 进程标识信息:PID、父进程 ID 等
- 进程状态信息:就绪、运行、阻塞等
- 调度信息:优先级、时间片等
- CPU 现场:程序计数器、寄存器、栈指针等
- 内存信息:页表、地址空间描述等
- 资源信息:打开的文件、信号、权限等
五、什么是进程控制
进程控制指的就是操作系统对进程做的一系列管理动作,常见包括:
- 创建进程
- 终止进程
- 阻塞进程
- 唤醒进程
- 挂起和恢复进程
这些动作都不是“口头通知”,而是操作系统通过修改 PCB、调整队列、保存或恢复上下文来真正完成的。
例如:
- 进程被创建时,要建立 PCB
- 进程阻塞时,要从就绪队列移到等待队列
- 进程结束时,要回收资源和记录退出状态
六、什么是进程上下文
进程上下文可以理解成:
为了让进程暂停后还能从原位置继续执行,必须保存下来的那一整套运行现场。
最核心的内容包括:
- 程序计数器
- 寄存器值
- 栈指针
- 调度状态
如果再广义一点,也常把:
- 页表
- 地址空间
- 内存映射信息
也一起看成进程运行环境的一部分。
七、什么是进程上下文切换
当 CPU 从进程 A 切到进程 B 时,需要做的事情包括:
- 保存 A 的上下文
- 恢复 B 的上下文
- 必要时切换页表和地址空间
- 让 B 从上次停下的位置继续运行
这就叫进程上下文切换。
为什么它比较重?因为它通常不只是保存几个寄存器,还可能涉及:
- 地址空间切换
- 页表切换
- TLB 影响
- 调度器数据结构更新
这也是为什么后面会说:
进程切换通常比线程切换更重。
八、总结
进程是运行中的程序实例,也是操作系统进行资源分配和管理的基本单位。进程在运行过程中会经历就绪、运行、阻塞等状态;操作系统通过 PCB 记录进程的标识、状态、资源和执行现场,并通过进程控制与上下文切换来管理多个进程的创建、运行、阻塞和退出。理解了进程状态、PCB 和上下文切换,后面再学线程、调度和进程通信就会顺很多。
