Appearance
题目
某进程访问的页 b 不在内存中,导致产生缺页异常,该缺页异常处理过程中不一定包含的操作是( )。
错因
B
觉得页表本来就有 b 这一项、缺页时只是改下状态,不存在"建立映射"的动作。但缺页前 b 在页表里没有有效页框号(存在位是 0),装入物理页框 f 之后必须把 f 写进页表项,否则下次 CPU 访问 b 仍然找不到——这一步必做。
C
把"读入"误以为是用户态 read 系统调用的事,跟缺页处理无关。其实缺页处理本身就是 OS 内核为了把不在内存的 b 弄进来跑的全套流程,从磁盘搬到内存正是缺页处理的核心动作。
D
以为存在位是 MMU 硬件自动维护的。其实存在位的 0/1 完全靠 OS 在调入 / 淘汰页时手动改——MMU 只负责"读它做判断"。装入 b 后若不把存在位置 1,下次访问 b 时 MMU 还是会判它不在内存,又触发一次缺页。
总解析
缺页处理的完整步骤(按发生顺序):
| 步骤 | 操作 | 是否必做 |
|---|---|---|
| ① | 保存现场,进入缺页处理程序 | 必做 |
| ② | 在物理内存中找一个空闲页框 f | 必做 |
| ②' | 若没有空闲页框,按置换算法淘汰一页(FIFO / LRU / CLOCK 等) | 可选 |
| ③ | 把页 b 从外存读入页框 f | 必做 |
| ④ | 修改页表项:填入 f、把存在位置 1 | 必做 |
| ⑤ | 恢复现场、重启被中断的指令 | 必做 |
A 选项的"淘汰内存中的页"对应步骤 ②'——只在物理内存已经满、没空闲页框可用时才需要执行。系统刚启动或当前进程页框还没占满的情况下,缺页时直接拿一个空闲页框就够,不必淘汰任何页。所以 A 是"不一定包含"。
B、C、D 都是缺页处理必然包含的步骤:
- B 建立 b 与 f 的对应——不建则 CPU 找不到 b
- C 把 b 从外存读入——缺页就是因为 b 不在内存,不读入毫无意义
- D 修改存在位——不改的话 MMU 下次还会判缺页
最终答案是 A。