Appearance
题目
下列选项中,会导致进程从执行态变为就绪态的事件是( )。
错因
A
P(wait) 操作如果信号量 S < 0 会阻塞当前进程——状态转换是执行 → 阻塞,不是执行 → 就绪。把 wait 操作的方向看反了:等不到资源是"主动让权进阻塞队列",跟"被动让位但仍可执行"完全不同。
B
申请内存失败时进程没有内存资源继续跑,进入阻塞态等内存可用——又是"执行 → 阻塞"。把"失败"误以为是"被打断"也不对:申请内存失败是进程自己等不到资源,不是被调度器抢走 CPU。
C
启动 I/O 后进程要等 I/O 完成,所以进入阻塞态——执行 → 阻塞。这个是 I/O 阻塞的最经典场景。把"启动 I/O"和"主动等数据"分开看不对——启动设备就意味着这次访问要等设备响应,进程必然被挂起。
总解析
进程三态转换里,执行 → 就绪的转换有一个关键特征:进程仍能继续跑,只是 CPU 让给别人了。区别于阻塞——阻塞是等不到外部事件、暂时跑不动。
| 事件 | 进程状态变化 | 类型 |
|---|---|---|
| P(wait) 阻塞 | 执行 → 阻塞(等信号量) | 等资源 |
| 申请内存失败 | 执行 → 阻塞(等内存) | 等资源 |
| 启动 I/O | 执行 → 阻塞(等 I/O) | 等外设 |
| 被高优先级进程抢占 | 执行 → 就绪 | 仅让 CPU、本身仍可跑 |
| 时间片用完 | 执行 → 就绪 | 同上 |
| 主动 yield | 执行 → 就绪 | 同上 |
判定钥匙:让出 CPU 之后还能立刻跑吗?能 → 就绪;要等 → 阻塞。
逐项核对:
- A P(wait) 阻塞:等信号量 → 阻塞(不是就绪)
- B 申请内存失败:等内存 → 阻塞(不是就绪)
- C 启动 I/O:等 I/O → 阻塞(不是就绪)
- D 被抢占:CPU 让给高优先级进程,自己数据齐备、随时能继续 → 就绪 ✓
最终答案是 D。