Appearance
题目
下列操作完成时,导致 CPU 从内核态转为用户态的是( )。
错因
A
阻塞进程是内核内部的事务——把当前进程的 PCB 移入等待队列、改变状态,全程在内核态完成。完成后通常紧接着调用调度程序(B)选下一个进程,仍在内核态。它的"完成时"并不直接对应"切回用户态"——切不切回要看后续调度选了哪个进程。
B
执行 CPU 调度本身完全在内核态进行(选择下一个进程、保存当前 PCB、加载新 PCB)。调度结束可能切回用户态(如果选中的进程要在用户态运行),但也可能继续内核态(比如调度后还有别的内核工作)。把调度的"完成"等同于"必然切回用户态"是过度推断;题目问"导致 ... 转为用户态",应该是描述方向更明确的事件。
C
唤醒进程(V 操作或类似机制)的工作是把目标进程从等待队列移到就绪队列,并不立即切换 CPU 给它——只是改变了它的状态。被唤醒的进程不会马上跑(它还没轮到 CPU),而当前正在运行的内核代码继续执行。所以唤醒完成时 CPU 仍在内核态。
总解析
核心概念:什么操作的"完成"会直接对应"内核态 → 用户态"?
答:系统调用的返回——它是用户态触发系统调用进入内核态、内核完成服务后通过 iret(或 sysret)返回用户态的标准流程。系统调用整体过程:
用户态 → [int 0x80 / syscall] → 内核态 → [系统调用处理程序] → [iret/sysret] → 用户态执行系统调用"完成时",对应着内核态返回到用户态的瞬间——这是题目描述的明确指向。
逐项再核对:
| 操作 | 起点态 | 完成时态 | 是否符合"内核 → 用户" |
|---|---|---|---|
| A 阻塞进程 | 内核态 | 内核态(接着调度) | ✗ |
| B 执行 CPU 调度 | 内核态 | 取决于选中进程 | ✗(不确定 → 不能描述为"导致转用户态") |
| C 唤醒进程 | 内核态 | 内核态 | ✗ |
| D 执行系统调用 | 用户态进入 → 内核完成 → 返回用户态 | 用户态 | ✓ |
最终答案是 D(执行系统调用)。
记忆要点:
- 用户 → 内核:陷入(中断、异常、系统调用入口)
- 内核 → 用户:返回(
iret、sysret),最常见的就是系统调用返回