Appearance
题目
下列由当前线程引起的事件或执行的操作中,可能导致该线程由执行态变为就绪态的是( )。
错因
A
键盘输入意味着线程要等待 I/O 完成——线程会被放入"等待键盘"的等待队列,状态从执行 → 阻塞,而不是变成就绪态。就绪 ≠ 阻塞:就绪是"只差 CPU 就能跑",阻塞是"在等某个事件,给 CPU 也没用"。
B
缺页异常发生时,操作系统要从磁盘把页调入内存——这是相对长的 I/O 等待。线程被挂起,状态变成执行 → 阻塞(等 I/O 完成)。等到页面调入后再转回就绪。所以缺页异常的直接转换不是"就绪",是"阻塞"。
D
wait() 操作可能让线程阻塞(如果信号量 ≤ 0),状态从执行 → 阻塞;如果信号量 > 0 则不阻塞继续执行——但都不会从执行直接变成"就绪态"。题目问的是"由执行态变为就绪态",wait 不符合。
总解析
线程的三种基本状态及转换:
就绪 ←—调度选中—→ 执行
|
├— 时间片用完 / yield → 就绪
├— I/O / wait / 阻塞事件 → 阻塞
└— 终止 → 退出
阻塞 —事件完成—→ 就绪关键区分:
- 执行 → 就绪:线程还能运行,但暂时不占 CPU。典型触发:① 时间片用完(被剥夺);② 高优先级线程到来(抢占);③ 主动出让 CPU(如调用
yield)。 - 执行 → 阻塞:线程不能运行,需等待某事件。典型触发:① I/O 请求;② 信号量 wait 不通过;③ 缺页等异常等待。
逐项判断:
| 选项 | 线程状态 | 是否符合"执行→就绪" |
|---|---|---|
| A 键盘输入 | 执行 → 阻塞(等 I/O) | ✗ |
| B 缺页异常 | 执行 → 阻塞(等页面调入) | ✗ |
| C 主动出让 CPU | 执行 → 就绪 | ✓ |
| D 信号量 wait | 执行 → 阻塞(信号量不够时) | ✗ |
主动出让 CPU(yield)正是自愿放弃 CPU 但不需要等任何事件的典型场景——所以放回就绪队列,等下次被调度即可继续运行。
最终答案是 C(主动出让 CPU)。
记忆要点:执行 → 就绪只有"被剥夺/被抢占/主动让出"三种触发;执行 → 阻塞才需要"等待外部事件"。