5 页面置换算法

功能目标

  1. 功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换
  2. 目标: 尽可能减少页面换入换出次数(即缺页中断次数)。具体来说,把未来不再使用或短期内较少使用的页面换出,通常只能在局部性原理指导下依据过往统计数据预测
  3. 页面锁定(Frame Locking):对于必须常驻内存的操作系统关键部分或时间关键(time critical)的应用进程(定时执行的程序?),使其不参与页面置换。实现方法:通过在页表中增加锁定标志位(lock bit)
  4. 算法评估方法:模拟一个页面置换的行为,记录出现缺页中断的次数(不需要考虑页偏移,只需考虑页号)

局部页面置换算法

仅针对一个进程、一个应用程序

前提:程序局部性

最优置换算法(OPT,optimal)

  1. 基本思路:当发生缺页中断时,对保持在内存中的每一个逻辑页面,计算它在下一次访问前,还需要等待的时间,从中选择等待时间最长的,作为被置换的页面
  2. 缺点:这只是一种理想状况,实际情况下,操作系统无法预知页面在再次被访问前,所需要等待的时间
  3. 可用作其他算法性能的评价依据(在一个模拟器上运行某个程序,第一遍访问时记录每个页面的访问情况,第二遍运行时即可使用最优置换算法)
  4. 示例:(缺页2次)
    image-20200710213117523

先进先出算法(FIFO)

  1. 基本思路:发生缺页中断时,将内存中停留时间最长(最早进入内存)的页面置换出去。操作系统维护着一个链表,记录内存中的逻辑页面,链首驻留时间最长,链尾驻留时间最短。缺页中断时,将链首的页面置换出去。
  2. 优点:实现简单
  3. 缺点:性能较差,被换出的页面可能是需要经常访问的页面,并且有Belady现象,因此FIFO较少单独使用
  4. 示例:(缺页5次)
    image-20200710212808350

最近最久未使用算法(Least Recently Used, LRU)

  1. 基本思路:发生缺页中断时,置换最久未被使用的页面
  2. 依据:对最优适用算法的近似。依据程序局部性原理,最近被访问的指令和数据很有可能再次被访问,反之,如果某个页面长时间未被访问,则很大概率将来长时间内不会再被访问。
  3. 优点:效果比较好,发生缺页中断的次数比较少
  4. 缺点:需要记录和查找每个页面最近使用的情况,时间开销比较大。
  5. 示例:(缺页3次)
    image-20200711091839352
  6. 查找置换页面的算法:
    • OS维护一个链表,每访问一个页面,查找链表中是否已存在该页面。若不存在,将其添加到链首;若存在,将链表中的页面移到链首。则链尾即为最近最久未被使用的页面
    • 使用一个栈来记录,每访问一个页面,将其压入栈顶。然后查找原栈内是否存在该页面,若有,将其抽出。则栈底即为最近最久未使用的页面。

时钟算法(Clock)

LRU算法的近似,FIFO算法的改进

  1. 基本原理:
    • 通过页表中的访问位(access/used bit)粗略记录最近页面的访问情况,置换掉最近未被访问的页面。
    • 当页面载入内存时,访问位置为0;页面被访问(读/写)时,访问位置为1(硬件实现)。将各个页面组织成环形链表(类似钟表面,指针指向最老的页面(最先进来)
    • 当发生缺页中断时,考察指针指向的最老的页面。若其访问位为0,立即置换,新页访问位置为1。若其访问位为1,将其访问位置为0(指针访问后,让这个页面老一些),指针移向下一个页面。依此类推。
  2. 示例:(缺页4次)
    image-20200711094915420
  3. 性能:实际性能接近LRU算法(略逊)

二次机会法(Enhanced Clock Algorithm)

  1. 基本原理:如果内存中的页帧进行过写操作,则页面置换时需将该页写回外存,时间开销较大。因此可同时利用页表中的访问位(used bit)和修改位(dirty bit)指导置换,改进Clock算法,使修改位为1的页面在指针扫描时多一次保留的机会。
    image-20200711102536394
  2. 性能:效果较好,性能接近 LRU 算法
  3. 示例:(缺页3次)
    image-20200711102735668

最不常用算法(Least Frequently Used,LFU)

  1. 基本原理:发生缺页中断时,将访问次数最少的页面置换出去
  2. 缺陷:
    • 需要对每个页面设置计数器,每次页面置换需要查找次数最少的页面。类似LRU,时间、空间开销较大
    • 未考虑时间因素。可能存在某些页面在程序启动时使用次数较多,但最近已经很少使用,然而由于总访问次数较多,不大会被置换出去。 -- > 解决方法:可使次数寄存器每隔一段时间右移一位(即除以2)

Belady现象

  1. 含义:采用FIFO算法时,有时会出现分配的物理内存越大,发生缺页中断的次数反而增加的现象

  2. 原因:FIFO算法未考虑进程访问内存页面的动态特征,与置换算法的目标不一致(替换较少使用的页面),因此被替换出去的页面未必是进程不会访问的

  3. LRU算法不会出现Belady现象的原因:LRU符合栈算法的特点,FIFO不符合这种特点

  4. 示例:
    image-20200711141527219


    image-20200711141713741

FIFO、LRU、Clock算法比较

  1. FIFO和LRU都是依据先进先出的思路,只是LRU会根据页面最近访问时间对页面顺序进行动态调整,而FIFO则依据页面进入内存的时间排序,时间固定。
  2. Clock算法是对LRU算法的近似,利用硬件提供的访问位和修改位模拟LRU中的最近访问时间,减小系统开销。
  3. 当程序本身不存在局部性时,LRU、Clock可能会退化为FIFO算法

全局页面置换算法

局部页面置换算法的问题

  1. 局部页面置换算法只考虑一个进程、一个应用程序的内存使用情况
  2. 程序在不同时间段对物理页帧的需求是动态变化的,但局部页面置换算法分配给每个应用程序的物理内存大小是固定的,限制了置换算法的灵活性

工作集模型(Working Set)

  1. 用于衡量程序的局部性

  2. 工作集:一个程序当前正在使用的逻辑页面集合,用W(t, Δ) 表示

    • t -- 表示当前执行的时刻
    • Δ -- 工作集窗口,即一个定长的页面访问时间窗口
    • W(t, Δ) -- 在t时刻之前的Δ窗口内的所有页面集合(随t动态变化)
    • | W(t, Δ) | -- 工作集长度,即页面数目

    image-20200711193955400

  3. 常驻集:当前时刻,进程实际驻留在内存中的页面集合

    • 工作集是进程在运行过程中的固有属性,而常驻集取决于OS分配的物理页帧大小及采用的页面置换算法
    • 如果一个进程的工作集全部在常驻集中,即工作集⊆常驻集,则进程将顺利进行,不会产出太多缺页中断(直到工作集发生剧烈变动,从而过渡到另一种状态)
    • 进程的常驻集增大到一定程度后,再增加常驻集的大小,缺页率也不会明显下降

两个全局置换算法

  1. 工作集页面置换算法

    • 设置一个工作集窗口,对于不在工作集窗口的物理页帧,自动置换出去,即使分配的物理内存没装满(若页面被写过,则写回外存;否则直接标记为空闲空间)
    • 不足之处:工作集大小固定不变
    • 例子:
      image-20200711202318919

  1. 缺页率页面置换算法

    • 常驻集大小可变。程序刚开始运行时,根据程序大小分配一定的物理内存空间。在程序运行过程中,再动态调整常驻集的大小

    • 可采用全局页面置换的方式。当发生缺页中断时,被置换的页面可以是在其他进程空间中,各个并发进程共同竞争物理页面

    • 具体实现:使用缺页率算法(PFF,Page Fault Frequency)来动态调整常驻集大小

      • 若缺页率偏大,则增大工作集(常驻集)窗口大小
      • 若缺页率偏小,则减小工作集窗口大小
      image-20200711210726999
    • 缺页率 = 缺页中断次数 / 内存访问次数,影响因素:

      • 页面置换算法
      • 分配给进程的物理页面大小
      • 页面本身大小
      • 程序局部性

抖动现象

  1. 含义:当分配给一个进程的物理页面过小,无法容纳一个工作集,即常驻集⊂工作集时,进程会出现很多缺页中断,需要频繁地在内外存间换入换出,从而使进程速度变慢

  2. 原因:随着同时运行的进程数量的增加,分配给每个进程的物理页面随之减少,缺页率不断上升

  3. 解决方法:OS需要选择合适的进程数和进程需要的物理帧数,以便在并发水平和缺页率之间获得平衡

    • 调整MPL(并发水平)
    • 目标:
      • 平均页缺失时间mean time between page faults (MTBF) = 页缺失时间 page fault service time (PFST)
      • 各个进程工作集之和 = 内存大小

    image-20200711213126032

posted @ 2022-02-16 14:10  DreamEagle  阅读(384)  评论(0编辑  收藏  举报