Skip to content

2012年 408 操作系统 第 45 题

操作系统2012年综合题8分

题目

某请求分页系统的局部页面置换策略如下:

  • 系统从 0 时刻开始扫描,每隔 5 个时间单位扫描一轮驻留集(扫描时间忽略不计)
  • 本轮没有被访问过的页框将被系统回收,放入空闲页框链尾,其中内容在下一次被分配之前不被清空
  • 当发生缺页时,如果该页曾被使用过且还在空闲页框链表中,则重新放回进程的驻留集中;否则,从空闲页框链表头部取出一个页框

假设不考虑其他进程的影响和系统开销,初始时进程驻留集为空。系统空闲页框链表中页框号依次为 32、15、21、41

进程 P 依次访问的 ⟨虚拟页号, 访问时刻⟩ 是:

⟨1, 1⟩、⟨3, 2⟩、⟨0, 4⟩、⟨0, 6⟩、⟨1, 11⟩、⟨0, 13⟩、⟨2, 14⟩

请回答下列问题:

(1) 访问 ⟨0, 4⟩ 时,对应的页框号是什么?

(2) 访问 ⟨1, 11⟩ 时,对应的页框号是什么?说明理由。

(3) 访问 ⟨2, 14⟩ 时,对应的页框号是什么?说明理由。

(4) 该策略是否适合于时间局部性好的程序?说明理由。

解析

完整时间线推演

按时间顺序逐事件追踪驻留集和空闲链:

时刻事件驻留集(页号 → 页框号)空闲链(链头 → 链尾)
0初始[32, 15, 21, 41]
1访问页 1 → 缺页,取链头 32[15, 21, 41]
2访问页 3 → 缺页,取链头 15[21, 41]
4访问页 0 → 缺页,取链头 21{1→32, 3→15, 0→21}[41]
5第一轮扫描:本轮(0~5)访问过的页 = {1, 3, 0}——全部驻留集都被访问 → 不回收任何页框[41]
6访问页 0 → 命中 框 21[41]
10第二轮扫描:本轮(5~10)只访问过 {0} → 回收页 1(框 32)和页 3(框 15)[41, 32, 15](按扫描顺序入链尾)
11访问页 1 → 缺页,但页 1 还在空闲链(框 32),直接放回驻留集{0→21, 1→32}[41, 15]
13访问页 0 → 命中 框 21[41, 15]
14访问页 2 → 缺页,页 2 从未访问过,取链头 41{0→21, 1→32, 2→41}[15]
15(第三轮扫描,本题不再问)

(1)访问 ⟨0, 4⟩ 的页框号

页 0 第一次被访问,缺页。空闲链此时还是 [21, 41](前两次访问已用掉 32、15)→ 取链头 21

答:页框号 21。

(2)访问 ⟨1, 11⟩ 的页框号

t=11 落在 t=10 第二轮扫描之后。第二轮扫描发生时(5~10 期间只访问了页 0),页 1 因"本轮未被访问"被回收到空闲链尾——但它的内容(页 1 的数据)并未被清空,框 32 在链中还存着页 1 的副本。

t=11 缺页时按规则查:"页 1 曾被使用过、且现在还在空闲链中" → 直接把框 32 放回驻留集,无需重新读盘。

答:页框号 32。

编者注(核心机制):这正是该策略的精妙之处——回收页框不立即清空内容给"重新放回"留了余地。如果回收时立即清零,再次访问页 1 就只能从链头取一个新框、还要从磁盘读 4 KB 数据,开销大得多。

(3)访问 ⟨2, 14⟩ 的页框号

页 2 在前面从未出现过——既不在驻留集,也不在空闲链中(链中残留的是页 1 的内容、页 3 的内容)。所以走"普通缺页"分支,取链头 41

答:页框号 41。

编者注(易错点):注意 t=14 时空闲链是 [15](41 已在 t=14 被取走前还在头部)。初学者容易把"链中残留的页 3 的内容"也算成"页 3 还在驻留集"——错。驻留集和空闲链是两个独立的集合:内容残留不等于"页还在使用",必须满足"页号被某个驻留集表项指向"才算在驻留集中。

(4)是否适合时间局部性好的程序?

适合。

为什么? 时间局部性好 = 最近访问过的页很可能很快又被访问。这套策略的优势恰好建立在这个假设上:

  • 扫描周期内被回收的页框只是"暂时离队"——内容还在
  • 一旦该页在不远的将来被访问 → 走 "重放" 分支(如本题的 ⟨1, 11⟩)→ 零磁盘 I/O

如果程序时间局部性差(每次访问都是不同的、新出现的页),重放命中率几乎为零,回收的页框只是占着空闲链不让其他用、还得不时地从链尾被冲走、最终触发真正的磁盘读——优势完全发挥不出。

编者注(与经典 LRU 对比):这种"回收 + 内容保留 + 可重放"的设计,本质上是在驻留集和工作集之间做出弹性扩张:

  • 严格的 LRU:驻留集 = 工作集,每次缺页必须读盘
  • 本题策略:驻留集 ≤ 工作集 + 空闲链中的"软驻留"页 → 命中率更高,但需要额外管理空闲链

这是 OS 内存章中"动态调整驻留集"的实际样例,2009-46(请求分页 + LRU)和本题对比着复习能加深对"驻留集 vs 工作集"的理解。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题