Appearance
题目
下列关于缺页处理的叙述中,错误的是( )。
错因
A
误以为缺页是 MMU 的"硬件错误"或"中断"。但缺页严格属于异常——是 CPU 在执行某条具体指令的地址转换过程中检测到的(同步事件,与具体指令绑定),不像外部中断(异步、与具体指令无关)。
B
误以为缺页处理由 MMU 等硬件自动完成。但 OS 才负责缺页处理——硬件 MMU 只能检测出缺页(产生异常),后续"找哪页缺、从哪个磁盘块读、放到哪个物理页框、更新页表"全是 OS 的缺页处理程序在做。
C
误以为缺页可以从 Cache 或主存其他位置读。但主存里就是没有这一页才叫缺页——必须到外存(硬盘上的页面文件 / swap 区)读入。如果在主存其他位置能找到,那就不算缺页。
总解析
核心区分(同步异常 vs 异步中断):
| 维度 | 异常(Exception) | 中断(Interrupt) |
|---|---|---|
| 触发源 | 当前指令执行过程中的内部错误 | 外部硬件信号(与指令无关) |
| 与指令关系 | 同步 —— 与具体指令强绑定 | 异步 —— 与执行进度无关 |
| 例子 | 缺页、除零、非法指令、自陷 | 时钟、键盘、网卡 |
| 处理后回到 | 该指令本身(重新执行)或下一条 | 下一条指令 |
逐项判断:
| 选项 | 叙述 | 判断 |
|---|---|---|
| A | 缺页是地址转换时 CPU 检测到的一种异常 | ✓ 对(同步异常) |
| B | 缺页处理由 OS 的缺页处理程序完成 | ✓ 对 |
| C | 缺页处理程序从外存读入所缺失的页 | ✓ 对 |
| D | 缺页处理完成后回到发生缺页指令的下一条指令执行 | ✗ 错 |
D 为什么错——必须重新执行缺页指令:
缺页发生时,触发缺页的那条指令本身还没完成访存 —— 它需要的数据/指令字根本就没拿到。
| 时机 | 状态 |
|---|---|
| 缺页指令尝试访存 | MMU 检测到页表项无效 → 触发缺页异常 |
| 缺页处理程序运行 | 把缺失页从外存装入主存,更新页表 |
| 处理完返回时 | 必须重新执行该缺页指令——因为它的访存还没完成 |
如果直接跳到下一条指令,那缺页指令的语义就完全没实现(数据没读到、运算没做、目的寄存器没写)——错误结论。
所以对比:
- 缺页:处理后回到缺页指令本身,重新执行(指令重启)
- 自陷(Trap):处理后回到陷阱指令的下一条(陷阱指令本身已完成)
- 算术溢出 / 除零:处理方式由 OS 决定,通常报错终止程序
最终答案是 D(错误的叙述)。
示意流程:
... PC = X 处的指令 LOAD R1, [虚地址 V]
│
├─ MMU 查页表:V 所在页不在主存 → 产生缺页异常
├─ 跳转到 OS 缺页处理程序
│ ├─ 选一个物理页框(可能要置换出某页)
│ ├─ 从外存读入 V 所在的页到该页框
│ └─ 更新页表项(标记为有效,记录物理页框号)
├─ 异常返回 → PC 仍 = X,重新执行 LOAD R1, [V]
│
├─ MMU 查页表:V 所在页已在主存 → 翻译成物理地址 P
└─ 完成 LOAD R1, [P],PC 推进到 X+4易错点速查:
- 缺页 = 异常(不是中断)—— 同步、与具体指令绑定
- 缺页处理后必须重启缺页指令,不是跳到下一条
- 缺页页要从外存读,不是 Cache、不是主存其他位置