Appearance
题目
下列选项中,不可能在用户态发生的事件是( )。
错因
A
系统调用恰恰是从用户态发起的——用户程序执行 trap 指令陷入内核态。"在用户态发生"通常理解为"事件触发时进程在用户态",syscall 触发时正是这种状态。题问"不可能",A 是常见的用户态事件,不是答案。
B
外部中断是异步事件,CPU 当时在哪个态都可能:用户进程跑在用户态时来一个时钟中断,照样能触发——硬件根本不管 CPU 现在是什么态,中断信号一来就响应。把"外部中断"误以为只能在内核态发生是没把"异步"想清楚。
D
缺页是访存时硬件触发的内中断,用户进程访存触发缺页是非常常见的事——在用户态执行 MOV 指令访问一个被换出的页,立刻触发缺页异常进入内核处理。把缺页当成"只能在内核态发生"是反着说的:触发时正在用户态,处理时切到内核态。
总解析
题问"不可能在用户态发生"。先理清"事件触发时进程所在态":
| 事件 | 触发时进程所在态 | 触发后是否切到内核 |
|---|---|---|
| A 系统调用 | 用户态(用户主动 trap) | 切到内核 |
| B 外部中断 | 任意态(异步) | 切到内核处理 |
| C 进程切换 | 必内核态 | 本身就是内核操作 |
| D 缺页 | 任意态(用户访存最常触发) | 切到内核处理 |
为什么进程切换必在内核态:
进程切换涉及保存当前进程的 PCB 上下文、修改调度数据结构、加载新进程的 PCB——这些都是内核数据结构,只能由内核态代码访问。用户态完全没有 PCB 概念,进程自己根本不知道自己被切换;切换发生时一定是已经陷入内核(被时钟中断、被 syscall 触发等),调度器在内核态选下一个进程。
关键判定:进程切换是调度器的工作,调度器是内核代码,必在内核态运行。用户态没有"切换进程"这种能力——用户进程只能跑、阻塞、退出,切到别的进程是 OS 的事。
A B D 都是"在用户态时发生触发"的事件,C 不可能在用户态发生。
最终答案是 C。