Appearance
题目
下列选项中,在用户态执行的是( )。
错因
B
缺页处理程序是 OS 的中断/异常处理程序,必在内核态运行——它要访问页表、PCB、磁盘 I/O 这些受保护的内核数据结构。误以为它在用户态多半是没把"程序在哪态"和"被谁触发"分开:缺页由用户态访存触发,但处理在内核态。
C
进程调度程序是调度器——它要修改 PCB、调度队列、TLB 等内核数据,必在内核态运行。用户态根本看不到这些数据结构。把它当成用户态程序是把"内核工作"当用户工作了。
D
时钟中断处理程序是中断 ISR,内核态运行——它要修改内核时钟变量、当前进程的 CPU 累计时间、剩余时间片等内核字段。所有中断处理程序都在内核态运行。
总解析
判断"在哪态运行"的钥匙:这个程序需要访问什么资源——只用用户态可访问资源 → 用户态;要访问内核数据结构 / 特权指令 → 内核态。
| 选项 | 程序 | 需要访问的资源 | 所在态 |
|---|---|---|---|
| A | 命令解释程序(shell) | 解析用户输入 + fork/exec 调用 | 用户态 ✓ |
| B | 缺页处理程序 | 页表、PCB、磁盘 I/O | 内核态 |
| C | 进程调度程序 | PCB、调度队列、TLB | 内核态 |
| D | 时钟中断处理程序 | 内核时钟变量、PCB 时间字段 | 内核态 |
关于 shell(命令解释程序):
shell 本质是一个用户程序——bash、zsh、cmd 都是普通进程,跑在用户态。它的工作流程:
读用户输入 → 解析命令 → fork() → exec() → wait()每一步都是用户态代码——fork、exec、wait 是系统调用,shell 通过它们陷入内核,但 shell 自己的代码在用户态。"系统调用"≠"shell 在内核态"——发起 syscall 的代码(shell)在用户态,被调用的服务(OS)在内核态。
速记:shell 是用户程序,不是 OS 的一部分——很多人以为 shell 是 OS 的一部分(因为开机就有),但它实际上跟 vim、git 一样是普通用户程序,只是开机自动启动而已。
最终答案是 A。