1.进程组成和状态
1.1. 进程的组成
您提到的三个部分是逻辑上进程必不可少的组成部分:
- 进程控制块 (PCB) : 唯一标志,操作系统的"管理控制中心"。
- 程序段 : 描述进程要做什么,即可执行的代码。
- 数据段 : 存放进程执行时所需数据,包括初始数据、工作区和堆等。
补充:在实际的内存布局中,数据段通常还会细分为:
- 初始化数据区(如全局变量)
- 未初始化数据区(BSS段)
- 堆(动态增长)
- 用户栈(函数调用、局部变量),它虽属于"数据",但在管理上和作用上非常独特。
1.2. 进程的状态
您的"三态图"和"五态图"是理解进程生命周期的核心。我们来清晰地展示和解释它们。
三态图(最基本、最核心的模型)
这个模型只关注进程与CPU 和自身运行条件的关系。
调度 时间片到/被抢占 等待事件(如I/O) 事件发生 就绪 运行 阻塞
三态解析:
- 运行:占用CPU。
- 就绪:万事俱备,只欠CPU。
- 阻塞:欠缺某种条件(非CPU,也欠CPU),即使给CPU也无法运行。
关键:所有复杂的多状态模型,都是在这个"就绪-运行-阻塞"铁三角的基础上扩展而来的。
五态图(更完整的生命周期模型)
在三态的基础上,增加了进程的"诞生"与"死亡",以及因资源管理 (尤其是内存紧张)而产生的挂起状态。
创建 接纳 调度 时间片到/被抢占 等待事件 事件发生 结束/异常终止 内存紧张/主动挂起 激活 (事件发生且被激活) 内存紧张 激活 新建 就绪 运行 阻塞 终止 挂起阻塞 挂起就绪
五态解析(新建、就绪、运行、阻塞、终止)及挂起:
- 新建:PCB已创建,但资源未完全就绪,尚未进入就绪队列。
- 终止:进程结束,资源待回收,PCB信息可能被保留以供父进程查询。
- 挂起 :这是一个非常重要的非活动 状态。
- 目的 :将暂时不运行的进程的完整映像(程序+数据)从内存移到外存,以释放宝贵的内存资源。
- 挂起就绪:进程在外存,但只要调入内存即可运行。
- 挂起阻塞:进程在外存,并且等待某个事件。即使事件发生,也需先被"激活"调入内存,才能转为就绪状态。
为什么从三态发展到五态(及更多)?
| 模型 | 关注点 | 解决的问题 |
|---|---|---|
| 三态模型 | CPU调度 | 如何公平、高效地在多个进程间分配CPU时间。 |
| 五态模型 | CPU调度 + 完整生命周期 + 内存管理 | 1. 描述进程从创建到消亡的全过程。 2. 引入了"挂起"来处理内存资源不足的问题,使系统能在有限物理内存下运行更多/更大的进程。 |
记忆与理解技巧
- 抓住核心三角 :永远先理解"就绪 ↔ 运行 ↔ 阻塞"这个三角关系。这是进程调度的灵魂。
- 理解转换箭头 :每个状态转换的箭头都对应一个具体的事件或系统调用 。
运行 -> 阻塞:进程主动请求资源或I/O(等待某事件,如:进程主动请求 I/O、等待资源、调用 sleep 等,导致无法继续执行。)。阻塞 -> 就绪:操作系统被动响应(所等待的事件完成,(如 I/O 结束),进程重新具备运行条件,进入就绪队列等待调度)。运行 -> 就绪:操作系统主动调度(时间片用完(在分时系统中)或被更高优先级进程抢占(在抢占式调度中))。就绪 → 运行:调度程序选中该进程,分配 CPU。
- 挂起的本质 :是内存管理 介入进程调度的体现,是进程映像在内存与外存之间的移动 ,目的是腾出物理内存空间。
您的总结"进程组成三部分,状态先有三态图,扩展为五态图"是非常准确和高效的学习路径。掌握这些,就掌握了进程概念最核心的骨架。
2.前驱图
用来表示哪些任务可以并行执行,哪些任务之间有顺序关系,具体如下图:
可知,AB C可以并行执行,但是必须A B C都执行完后,才能执行D,这就确定了
两点:
任务间的并行、任务间的先后顺序
3.
用来表示进程和资源之间的分配和请求关系,如下图所示:
P代表进程,R代表资源,R方框中有几个圆球就表示有几个这种资源,在上
图中,R1指向P1,表示R1有
一个资源已经分配给了P1,P1指向R2,表示P1还需
要请求一个R2资源才能执行。
阻塞节点:某进程所请求的资源已经全部分配完毕,无法获取所需资源,该
进程被阻塞了无法继续。如上图中P2。
非阻塞节点:某进程所请求的资源还有剩余,可以分配给该进程继续运行。
如上图中P1、P3。
当一个进程资源图中所有进程都是阻塞节点时,即陷入死锁状态
一个进程执行完成后,会把请求的资源还回去