2.2.3 进程的状态
本课核心知识点整理
本节导学
进程是动态的,所以操作系统必须记录它当前处于什么状态。软件设计师考试主要要求掌握三态模型和五态模型,其中三态模型是核心:运行态、就绪态、阻塞态。状态名称本身不难,难点在于分清“等 CPU”和“等事件/资源”。
本节要建立一个判断标准:运行态占有 CPU;就绪态除 CPU 以外都满足;阻塞态缺少某个事件或非 CPU 资源,即使给它 CPU 也不能继续运行。
三种基本状态
| 状态 | 含义 |
|---|---|
| 运行态 | 正在占用 CPU 执行 |
| 就绪态 | 具备运行条件,只差 CPU |
| 阻塞态 | 等待 I/O、资源或某个事件,暂时不能运行 |
就绪和阻塞最容易混:就绪是“能运行但没 CPU”,阻塞是“条件没满足,给 CPU 也不能运行”。
单处理机系统中,同一时刻通常只有一个进程处于运行态,因为 CPU 只能真正执行一个进程。其他具备运行条件的进程排在就绪队列中,等待调度程序分配 CPU。
状态转换的触发条件
| 转换 | 触发条件 | 直觉 |
|---|---|---|
| 就绪 -> 运行 | 被调度程序选中 | 排队等 CPU,终于轮到它 |
| 运行 -> 就绪 | 时间片用完或被抢占 | CPU 时间用完,回队列排队 |
| 运行 -> 阻塞 | 请求 I/O、等待资源或事件 | 缺少非 CPU 条件,继续跑也没用 |
| 阻塞 -> 就绪 | 等待的事件发生或资源可用 | 条件满足,但还要重新等 CPU |
阻塞态通常不能直接变成运行态。即使 I/O 完成或资源释放,该进程也只是重新具备运行条件,需要进入就绪队列,等待调度程序分配 CPU。字幕里也强调“没有等待直接到运行态的变迁”。
为什么没有“就绪 -> 阻塞”的常规箭头
就绪态表示除 CPU 以外的资源都已满足,它只差 CPU。默认情况下,就绪队列里的进程不会因为“还没运行”而主动发起 I/O 或申请新资源;这些动作通常要在运行态执行指令时才会发生。所以三态模型里常见的是运行态进入阻塞态,而不是就绪态直接进入阻塞态。
同理,时间片用完不是阻塞。时间片用完只是 CPU 使用权到期,进程本身仍具备运行条件,因此从运行态回到就绪态。
与 PV、I/O、调度的关系
进程调度负责从就绪队列中挑选进程进入运行态。I/O 请求会让运行进程进入阻塞态。PV 操作中,如果 P 操作后资源不足,进程会进入阻塞队列;V 操作唤醒等待者时,被唤醒进程进入就绪队列,而不是立刻运行。
这个关系会反复出现在后续题中:唤醒不等于立即占有 CPU,唤醒只是从阻塞变为就绪。
做题路线
- 先问进程在等什么:等 CPU 是就绪,等 I/O/资源/事件是阻塞,正在 CPU 上执行是运行。
- 看到“时间片用完、被抢占”,判断运行态到就绪态。
- 看到“请求 I/O、等待事件”,判断运行态到阻塞态。
- 看到“I/O 完成、资源释放、等待事件发生”,判断阻塞态到就绪态。
- 看到“被调度程序选中”,判断就绪态到运行态。
例题
单选
进程已经具备运行条件,只是等待 CPU,此时处于:
单选
进程运行过程中请求 I/O,一般会发生:
单选
阻塞进程等待的 I/O 完成后,通常先进入:
自查要点
- 就绪态和阻塞态的本质区别是什么?
- 时间片用完会导致哪个状态转换?
- 为什么阻塞态不能直接到运行态?