Appearance
题目
下列事件或操作中,可能导致进程 P 由执行态变为阻塞态的是( )。
Ⅰ. 进程 P 读文件 Ⅱ. 进程 P 的时间片用完 Ⅲ. 进程 P 申请外设 Ⅳ. 进程 P 执行信号量的 wait() 操作
错因
A
漏掉了 Ⅲ(申请外设)。可能觉得"申请"只是提个请求就完事。其实很多外设是独占型(打印机、磁带),如果设备被别的进程占着,申请的进程必须等设备空出来——等待期间挂到设备等待队列,状态就是阻塞。
B
把 Ⅱ 时间片用完误判成阻塞。这是经典混淆:时间片用完只是被强制让出 CPU,进程还能继续跑,只是没轮到——这是就绪态。阻塞 = 必须等某个事件发生才能继续,时间片用完不需要等任何事件,差别就在这里。
C
漏掉了 Ⅰ(读文件)。可能把 read 当成普通函数调用立即返回了。但 read 系统调用底层要等磁盘 I/O 完成(毫秒级),这段等待期进程被挂入设备等待队列、状态切到阻塞,I/O 完成中断后才被唤醒。
总解析
题面问"可能导致执行态 → 阻塞态"——只要存在一种情形会触发阻塞,就算入选。
进程从执行态出去有两条路,区别在于"还能不能继续跑":
| 转出方向 | 触发条件 | 例子 |
|---|---|---|
| 执行 → 就绪 | 被动让出 CPU 但仍可继续 | 时间片用完、被更高优先级抢占 |
| 执行 → 阻塞 | 必须等某个事件发生才能继续 | 等 I/O 完成、等被占资源、等信号量 / 锁 |
照这条标准逐项判:
| 操作 | 转向 | 理由 |
|---|---|---|
| Ⅰ 读文件 | ✓ 阻塞 | 等磁盘 I/O 完成,进程挂入设备等待队列 |
| Ⅱ 时间片用完 | ✗ 就绪 | 还能继续跑,只是没轮到 |
| Ⅲ 申请外设 | ✓ 阻塞 | 外设被占时进程要等设备空出来 |
| Ⅳ 执行 wait() | ✓ 阻塞 | S 减 1 后若 S < 0 则进程挂入信号量等待队列 |
可能阻塞的是 Ⅰ、Ⅲ、Ⅳ。
最终答案是 D。