Appearance
题目
下列选项中,可能导致当前进程 P 阻塞的事件是( )。
Ⅰ. 进程 P 申请临界资源 Ⅱ. 进程 P 从磁盘读数据 Ⅲ. 系统将 CPU 分配给高优先级的进程
错因
A
承认 Ⅰ 申请临界资源会阻塞,但漏掉了 Ⅱ。可能把"读磁盘"想成了 CPU 直接读、没意识到磁盘 I/O 远远慢于 CPU——OS 一定会把进程切到阻塞态等数据就绪,这是 I/O 阻塞的典型场景。
B
只承认了 Ⅱ 这种"等硬件 I/O"的阻塞,把 Ⅰ"申请临界资源"理解成了"瞬间能拿到的事"。但临界资源就是一次只允许一个进程使用,别人正占着的话,进程 P 必须挂起进等待队列——这就是阻塞,跟等 I/O 在状态转换上是一回事(都是运行 → 阻塞)。
D
把"被高优先级进程抢占"误认成阻塞了。被抢占时进程 P 是从运行态变就绪态(CPU 让出去了,但数据齐备、随时能继续跑),而阻塞态是"等某个事件、暂时跑不了"——两者在三态模型里完全不同。区分钥匙:让出 CPU 是因为"调度选了别人"还是"自己等不到东西"。
总解析
三态模型里"阻塞"是等待外部事件而暂时无法继续执行。被动让出 CPU 不一定就是阻塞,要看让出后进程在哪个队列里。
| 状态转换 | 触发场景 | 进入哪种状态 |
|---|---|---|
| 运行 → 阻塞 | 等 I/O / 等临界资源 / 等信号量 / 等通信对方 | 阻塞队列 |
| 运行 → 就绪 | 时间片用完 / 被高优先级进程抢占 / 进程主动 yield | 就绪队列 |
| 阻塞 → 就绪 | 等待事件发生(被唤醒) | 就绪队列 |
逐个判:
- Ⅰ 申请临界资源:被别人占用时进入资源等待队列 → 阻塞 ✓
- Ⅱ 从磁盘读数据:典型 I/O 等待,磁头/数据就绪要时间 → 阻塞 ✓
- Ⅲ CPU 分给高优先级进程:当前进程被抢占,但数据齐备、随时可跑 → 进就绪队列,不是阻塞 ✗
仅 Ⅰ Ⅱ 会让 P 阻塞。
最终答案是 C。