Skip to content

2012年 408 操作系统 第 23 题

操作系统2012年选择题2分

题目

下列选项中,不可能在用户态发生的事件是( )。

错因

A

系统调用恰恰是从用户态发起的——用户程序执行 trap 指令陷入内核态。"在用户态发生"通常理解为"事件触发时进程在用户态",syscall 触发时正是这种状态。题问"不可能",A 是常见的用户态事件,不是答案。

B

外部中断是异步事件,CPU 当时在哪个态都可能:用户进程跑在用户态时来一个时钟中断,照样能触发——硬件根本不管 CPU 现在是什么态,中断信号一来就响应。把"外部中断"误以为只能在内核态发生是没把"异步"想清楚。

D

缺页是访存时硬件触发的内中断,用户进程访存触发缺页是非常常见的事——在用户态执行 MOV 指令访问一个被换出的页,立刻触发缺页异常进入内核处理。把缺页当成"只能在内核态发生"是反着说的:触发时正在用户态,处理时切到内核态。

总解析

题问"不可能在用户态发生"。先理清"事件触发时进程所在态":

事件触发时进程所在态触发后是否切到内核
A 系统调用用户态(用户主动 trap)切到内核
B 外部中断任意态(异步)切到内核处理
C 进程切换必内核态本身就是内核操作
D 缺页任意态(用户访存最常触发)切到内核处理

为什么进程切换必在内核态

进程切换涉及保存当前进程的 PCB 上下文、修改调度数据结构、加载新进程的 PCB——这些都是内核数据结构,只能由内核态代码访问。用户态完全没有 PCB 概念,进程自己根本不知道自己被切换;切换发生时一定是已经陷入内核(被时钟中断、被 syscall 触发等),调度器在内核态选下一个进程。

关键判定:进程切换是调度器的工作,调度器是内核代码,必在内核态运行。用户态没有"切换进程"这种能力——用户进程只能跑、阻塞、退出,切到别的进程是 OS 的事。

A B D 都是"在用户态时发生触发"的事件,C 不可能在用户态发生。

最终答案是 C

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题