为什么要引入进程
- 多道程序设计系统中,CPU 在各程序之间高速切换
- 需要一种抽象实体来描述正在运行的程序,以便 OS 进行管理和调度
- 顺序执行:I1 → C1 → P1 → I2 → C2 → P2 → …(无并发,资源利用率低)
- 引入进程后,多道程序可并发执行,提高 CPU 和 I/O 利用率
进程的定义
- 对正在运行程序的一个抽象
- 进程是系统进行资源分配和调度的基本单位
- 进程是程序在数据集合上的一次运行活动
PCB(进程控制块)
- 进程在操作系统中的表示,OS 通过 PCB 管理进程
- 包含以下信息:
- 进程标识符(PID):唯一标识一个进程
- 状态:运行态、就绪态、阻塞态等
- 优先级:调度依据
- 寄存器上下文:程序计数器 PC、栈指针 SP、通用寄存器等
- 内存指针:代码段、数据段、栈段指针
- 资源清单:打开的文件、I/O 设备等
- 父进程/子进程指针:维护进程家族关系
- 其他:记账信息、消息队列指针等
进程存储器映像
- 用户空间:
- 代码段(Text):程序代码,只读
- 数据段(Data):全局变量、静态变量
- 栈段(Stack):函数调用参数、返回地址、局部变量
- 系统空间:
进程状态(5 状态模型)
- 创建态(New):进程正在被创建,OS 分配 PCB
- 就绪态(Ready):具备运行条件,等待 CPU 调度
- 运行态(Running):正在使用 CPU 执行指令
- 阻塞态(Blocked/Waiting):进程等待某个事件发生(如 I/O 完成)
- 终止态(Terminated):进程执行完毕,OS 回收资源
状态转换条件
| 转换 | 条件 |
|---|
| 创建 → 就绪 | PCB 初始化完成,进入就绪队列 |
| 就绪 → 运行 | 调度程序选中该进程 |
| 运行 → 就绪 | 时间片用完 / 被高优先级进程抢占 |
| 运行 → 阻塞 | 等待某事件(如 I/O、信号量) |
| 阻塞 → 就绪 | 所等待的事件发生 |
| 运行 → 终止 | 进程执行完毕或被撤销 |
进程组织方式
- 链接方式:按进程状态(就绪、阻塞等)将 PCB 链接成不同队列
- 索引方式:建立就绪索引表、阻塞索引表,通过索引查找 PCB
- 树形结构:UNIX/Linux 用树形结构组织进程,
pstree 可见父子关系
当前进程指针
- 系统中有一个指针指向当前正在运行的进程的 PCB
- 调度切换时,该指针指向新选中的进程 PCB