Appearance
题目
某请求分页存储系统的页大小为 4KB,按字节编址。系统给进程 P 分配 2 个固定的页框并采用改进型 Clock 置换算法,进程 P 页表的部分内容如下表所示:
| 页号 | 页框号 | 存在位(1:存在;0:不存在) | 访问位(1:访问;0:未访问) | 修改位(1:修改;0:未修改) |
|---|---|---|---|---|
| ... | ... | ... | ... | ... |
| 2 | 20H | 0 | 0 | 0 |
| 3 | 60H | 1 | 1 | 0 |
| 4 | 80H | 1 | 1 | 1 |
| ... | ... | ... | ... | ... |
若 P 访问虚拟地址为 02A01H 的存储单元,则经地址变换后得到的物理地址是( )。
错因
A
把虚拟地址里的 02H 误当成了页框号直接拼上偏移。但 02H 是页号,要先去页表查它对应哪个页框号,再把页框号拼上偏移。直接拿页号当页框号是没走地址变换的常见错。
B
直接拿了页表里页 2 那一行的"页框号 20H"拼上偏移,没看存在位。页 2 的存在位是 0——这说明页 2不在内存,那个 20H 是历史值(也许是上次被换出前的位置),现在不能用。访问页 2 会触发缺页,物理地址里出现的是换入后实际所在页框号,不会是 20H。
D
注意到要发生缺页置换、用了改进型 Clock 算法,但替换对象判反了——把"M=1 的页 4"当成了被替换的对象。改进型 Clock 的核心理念恰恰是优先保留 M=1 的页(脏页换出代价高,要写回磁盘),所以应该先替换 M=0 的页 3,让脏页 4 多留一会儿。把 M 的方向想反就会得到 D。
总解析
整体流程:地址拆分 → 查页表 → 触发缺页 → 改进型 Clock 选受害者 → 拼物理地址。
第 1 步:拆分虚拟地址
页大小 4KB = B → 页内偏移 12 位(3 位十六进制)。
虚拟地址 02A01H 拆分:
→ 页号 2,偏移 A01H。
第 2 步:查页表
页 2 行:存在位 = 0 → 页 2 不在内存 → 触发缺页中断。
第 3 步:选受害者(改进型 Clock)
P 只分到 2 个页框,当前住着的是页 3(框 60H)和页 4(框 80H)。两页的 (访问位 A, 修改位 M):
| 页 | 框 | A | M | 类别 |
|---|---|---|---|---|
| 3 | 60H | 1 | 0 | (1, 0) |
| 4 | 80H | 1 | 1 | (1, 1) |
改进型 Clock 把 (A, M) 分四类,替换优先级从高到低:
| 类别 | 含义 | 替换代价 |
|---|---|---|
| (0, 0) | 未访问、未修改 | 最低(直接丢) |
| (0, 1) | 未访问、已修改 | 较低(要写回) |
| (1, 0) | 近期访问、未修改 | 较高 |
| (1, 1) | 近期访问、已修改 | 最高(最不该替换) |
算法分轮扫描,第一轮找 (0,0) 不动位;第二轮找 (0,1) 沿途清 A 位,没找到就回到第一轮重做:
| 轮 | 找的类别 | 走查 | 状态变化 |
|---|---|---|---|
| 第 1 轮 | (0, 0) | 页 3 (1,0) ✗、页 4 (1,1) ✗ | 不动 |
| 第 2 轮 | (0, 1),沿途清 A | 页 3 不匹配 (0,1),清 A → (0,0);页 4 不匹配 (0,1),清 A → (0,1) | 页 3 (1,0)→(0,0);页 4 (1,1)→(0,1) |
| 第 3 轮 | 等价回到第 1 轮 找 (0, 0) | 页 3 (0,0) ✓ 匹配 | 替换页 3 |
替换页 3 → 页 2 调入页框 60H。
第 4 步:拼物理地址
最终答案是 C。