虚拟存储管理

页面替换策略

当发生缺页异常时,如果已无空闲页框,系统要选择一个驻留页面进行淘汰

全局页面替换策略

全局页面替换策略假设所有的驻留页面都可作为置换对象,而不考虑页面所属进程

最佳页面替换算法(Optimal,OPT)

  • 当要调入一页而必须淘汰旧页时,淘汰以后不再访问的页,或距现在最长时间后才访问的页。
  • 页面引用无法预知,所以不能实际应用
  • 可作为具体算法的衡量标准

先进先出页面替换算法(First In First Out,FIFO)

  • 总是淘汰最先调入内存的页面
  • 系统中设置一张有 \(m\) 个元素的页号表,以 \(k\) 指示在内存中驻留时间最长的页面,淘汰时 \(P[k] = 新页的页号\),\(k = (k + 1)\ mod\ m\)
  • Belady 异常:增加物理页框数会导致更多的缺页异常

改进的先进先出页面替换算法:页面缓冲算法

  • 维护两个 FIFO 队列:修改页面队列和非修改(空闲)页面队列
  • 当发生缺页中断时,按照 FIFO 选出淘汰页,并不立即抛弃它,而是根据其内容是否被修改过选择进入两个队列之一,需要装入的页面被读进非修改队列队首所指向的页框,对于修改页面队列,成批地将其写回,并将空闲页框加入非修改页面队列
  • 便于被淘汰页的快速找回

最近最少使用(Least Recently Used,LRU)页面替换算法

  • 基于局部性原理,淘汰最近一段时间最久未被访问的页
  • 维护一个页面淘汰队列,队尾总是最近访问的页,队头总是最近最少使用的页
  • 关键是确定页面最后访问以来所经历的时间
引用位法(最近未使用页面替换算法,Not Recently Used,NRU)

为每页设置一个引用位,每次访问某页时,将其引用位置 1,间隔时间 t 周期性地将所有页的引用位置 0;淘汰时从引用位为 0 的页面中挑选页面进行淘汰,选中要淘汰的页面后,将其他页面的引用位置 0。通常将 t 设为一个或数个时钟中断周期。

计数法(最不常用页面替换算法,Not Frequently Used,NFU)

当页面被引用时,页引用计数器自动计数,每隔时间 t 将所有页的引用计数清除,页引用计数值最小的页面就是最不经常使用的页

记时法

为每页设置一个记时单元,每当页面被引用时,把当前绝对时间置入记时单元,每隔时间 t 将所有记时单元清除,值最小的页面就是最久未使用的页面

老化算法(Aging)

为每个页设置一个多位寄存器 r,当页面被访问时,对应寄存器最左边的位置 1,每隔时间 t 将寄存器 r 右移 1 位,寄存器 r 值最小的页面就是最久未使用的页面

第二次机会页面(Second Chance Replacement,SCR)替换算法

首先检查 FIFO 队列的队头,如果引用位为 0,表明其最近未被使用,则淘汰;如果引用位为 1,表明其虽然较早进入内存,但最近仍在使用,所以则将其引用位置 0 后移至队尾

时钟(Clock Policy Replacement)页面替换算法

与 SCR 算法本质上没有区别,只是减少了出队入队的次数

改进的时钟页面替换算法
  1. 选择最佳淘汰页面。从指针当前位置开始扫描循环队列,扫描过程中不改变引用位,把遇到的第一个 \(r = 0\),\(m = 0\)
  2. 如果 1 失败,则再次从原位置开始,查找 \(r = 0\),\(m = 1\)
  3. 如果 2 失败,指针再次回到起始位置,此时由于所有的页面的引用位均为 0,再转向 1 或 2 操作,一定可以找出一个可淘汰的页面

局部页面替换策略

局部集的转换。并且当某个给定的进程产生缺页异常时,不允许通过缩小其他进程的驻留页面集来解决问题。

局部最佳页面(Local Minimum Replacement,MIN)替换算法

  • 无论发生缺页与否,每一步都要考虑引用串,如果此页面在时间间隔 \([t, t + \tau]\) 内未被再次引用,那么就移出;否则,此页面被保留在进程的驻留集中,直到再次被引用。其中,时间间隔 \([t, t + \tau]\) 称为滑动窗口,其大小为 \(\tau + 1\)
  • 需要预知引用串,不能实际应用

工作集模型和工作集(Working Set Replacement,WS)置换算法

  • 基于程序局部性原理,考察历史页面引用情况
  • 用 \(W(t, \Delta)\) 表示在时刻 \(t - \Delta\) 到时刻 \(t\) 之间所访问的页面集合,即进程在时刻 \(t\) 的工作集,变量 \(\Delta\)

模拟工作集替换算法

  • 工作集策略监督驻留页面变化的开销很大,同时难以确定 \(\Delta\)。
  • 为每个页面设置引用位及关联的时间戳,通过超时中断,每隔若干条指令就周期性地检查引用位及时间戳,当发现引用位为 1 时,将其置 0 并将这次改变的时间作为时间戳记录下来;当发现引用位为 0 时,通过系统当前时间戳减去页面时间戳,计算出上次使用以来未被再次访问的时间间隔,记作 \(t\_off\),其值会随着超时中断的处理而不断增加,除非页面再次期间被再次引用,导致其引用位为 1(这种情况下会更新其时间戳)。如果 \(t\_off\) 大于系统时间参数 \(t\_max\),则将页面从工作集中移出。

缺页频率(Page Fault Frequency Replacement,PFF)替换算法

  • 根据缺页之间的时间间隔对缺页频率进行测量,每次缺页时利用测量时间调整进程工作集尺寸。
  • 如果本次缺页与前次缺页之间的时间间隔超过临界值 \(\tau\),那么将这个时间间隔内未引用的所有页面移出工作集