页面置换算法

页面置换算法概念

功能

当出现缺页异常,需调入新页面而内存已满时,使用置换算法选择被置换的物理页面

目标

  • 尽可能减少页面的调入调出次数
  • 把未来不再访问或短期内不访问的页面调出

分类

  • 局部页面置换算法

    置换页面的选择范围仅局限于当前进程占用的物理页面内

  • 全局页面置换算法

    置换页面的选择范围时所有可换出的物理页面

局部页面置换算法

最优算法

思路

该算法是基于未来的情况决定当前最优的置换页面,一般会置换掉未来最长时间不访问页面,由于是基于未来的情况对当前做出变化,因此为置换最优算法。

实现

  • 缺页时,计算内存中每个逻辑页面的下一次访问时间
  • 选择未来最长时间不访问的页面

特征

  • 缺页最少,是理想情况
  • 由于是基于未来的情况,所以比较难于实现,计算机很难能够预测将要发生的事
  • 该算法可作为衡量其他算法的标准,即算法的缺页次数越接近最优算法,则此算法越合适

先进先出算法 (First-In First-Out, FIFO)

思路

该算法会记录每个页面加载进内存的时间,当发生缺页异常时,会将最先加载进来的页面优先置换出去,即选择在内存驻留时长最长的页面进行置换。

实现

  • 维护一个记录所有位于内存中的逻辑页面链表
  • 链表元素按驻留内存的时间排序,链首最长,链尾最短
  • 出现缺页时,选择链首页面进行置换,新页面加到链尾

特征

  • 实现简单
  • 性能较差,调出的页面可能经常被访问
  • 进程分配物理页面数增加时,缺页并不一定减少(Belady现象)
  • 很少单独使用

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

思路

  • 选择最长时间没有被引用的页面进行置换
  • 如果某些页面长时间未被访问,则它们在将来还可能长时间不会访问

实现

  • 缺页时,计算内存中每个逻辑页面的上一次访问时间
  • 选择上一次使用到当前时间最长的页面

特征

  • 最优算法的近似,基于历史的访问时间来分析
  • 需要单独维护访问的记录链表,每次访问都需要更新记录链表,开销太大

可能的实现方法

页面链表

  • 系统维护一个按最近一次访问时间排序的页面链表
    • 链表首节点时最近刚刚使用过的页面
    • 链表尾节点时最久未使用的页面
  • 访问内存时,找到相应页面,并把它移到链表之首
  • 缺页时,置换链表尾节点的页面

活动页面栈

  • 访问页面时,将此页号压入栈顶,并将栈内相同页号抽出
  • 缺页时,置换栈底的页面

时钟置换算法 (Clock)

思路

仅对页面的访问情况进行大致统计

数据结构

  • 在页表项中增加访问位,描述页面在过去一段时间的访问情况
  • 各页面组织成环形链表
  • 指针指向最先调入的页面

算法

  • 访问页面时,在页表项记录页面访问情况
  • 缺页时,从指针处开始顺序查找尾被访问的页面进行置换

特征

是LRU和FIFI和折中

实现

  • 页面装入内存时,访问位初始化为0
  • 访问页面(读/写)时,访问位置1
  • 缺页时,从指针当前位置顺序检查环形链表
    • 访问位为0,则置换该页
    • 访问位为1,则访问位置0,并指针移动到下一个页面,直到找到可置换的页面

改进的Clock算法

算法

减少修改页的缺页处理开销

算法

  • 在页面中增加修改位,并在访问时进行相应修改
  • 缺页时,修改页面标志位,以跳过有修改的页面

状态修改前后对比

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

实现

  • 每个页面设置一个访问计数
  • 访问页面时,访问技术加1
  • 缺页时,置换技术最小的页面

特征

  • 算法开销大
  • 开始时频繁使用但以后不使用的页面很难置换
    • 解决方法:计数定期右移

LRU和LFU的区别

  • LRU关注多久未访问,时间越短越好
  • LFU关注访问次数,次数越多越好

全局页面置换算法

  • 工作集置换算法

  • 缺页率置换算法

posted @ 2021-03-05 17:12  bGpi  阅读(155)  评论(0编辑  收藏  举报