页面置换算法概念
功能
当出现缺页异常,需调入新页面而内存已满时,使用置换算法选择被置换的物理页面。
目标
- 尽可能减少页面的调入调出次数
- 把未来不再访问或短期内不访问的页面调出
分类
局部页面置换算法
最优算法
思路
该算法是基于未来的情况决定当前最优的置换页面,一般会置换掉未来最长时间不访问页面,由于是基于未来的情况对当前做出变化,因此为置换最优算法。
实现
- 缺页时,计算内存中每个逻辑页面的下一次访问时间
- 选择未来最长时间不访问的页面
特征
- 缺页最少,是理想情况
- 由于是基于未来的情况,所以比较难于实现,计算机很难能够预测将要发生的事
- 该算法可作为衡量其他算法的标准,即算法的缺页次数越接近最优算法,则此算法越合适
先进先出算法 (First-In First-Out, FIFO)
思路
该算法会记录每个页面加载进内存的时间,当发生缺页异常时,会将最先加载进来的页面优先置换出去,即选择在内存驻留时长最长的页面进行置换。
实现
- 维护一个记录所有位于内存中的逻辑页面链表
- 链表元素按驻留内存的时间排序,链首最长,链尾最短
- 出现缺页时,选择链首页面进行置换,新页面加到链尾
特征
- 实现简单
- 性能较差,调出的页面可能经常被访问
- 进程分配物理页面数增加时,缺页并不一定减少(Belady现象)
- 很少单独使用
最近最久算法 (Least Recently Used, LRU)
思路
- 选择最长时间没有被引用的页面进行置换
- 如果某些页面长时间未被访问,则它们在将来还可能长时间不会访问
实现
- 缺页时,计算内存中每个逻辑页面的上一次访问时间
- 选择上一次使用到当前时间最长的页面
特征
- 最优算法的近似,基于历史的访问时间来分析
- 需要单独维护访问的记录链表,每次访问都需要更新记录链表,开销太大
可能的实现方法
页面链表
- 系统维护一个按最近一次访问时间排序的页面链表
- 链表首节点时最近刚刚使用过的页面
- 链表尾节点时最久未使用的页面
- 访问内存时,找到相应页面,并把它移到链表之首
- 缺页时,置换链表尾节点的页面
活动页面栈
- 访问页面时,将此页号压入栈顶,并将栈内相同页号抽出
- 缺页时,置换栈底的页面
时钟置换算法 (Clock)
思路
仅对页面的访问情况进行大致统计
数据结构
- 在页表项中增加访问位,描述页面在过去一段时间的访问情况
- 各页面组织成环形链表
- 指针指向最先调入的页面
算法
- 访问页面时,在页表项记录页面访问情况
- 缺页时,从指针处开始顺序查找尾被访问的页面进行置换
特征
是LRU和FIFI和折中
实现
- 页面装入内存时,访问位初始化为0
- 访问页面(读/写)时,访问位置1
- 缺页时,从指针当前位置顺序检查环形链表
- 访问位为0,则置换该页
- 访问位为1,则访问位置0,并指针移动到下一个页面,直到找到可置换的页面
改进的Clock算法
算法
减少修改页的缺页处理开销
算法
- 在页面中增加修改位,并在访问时进行相应修改
- 缺页时,修改页面标志位,以跳过有修改的页面
![技术分享图片](https://gitee.com/bGpi/picture/raw/master/image-20210305170047841.png)
最不常用算法 (Least Frequently Used, LFU)
实现
- 每个页面设置一个访问计数
- 访问页面时,访问技术加1
- 缺页时,置换技术最小的页面
特征
- 算法开销大
- 开始时频繁使用但以后不使用的页面很难置换
LRU和LFU的区别
- LRU关注多久未访问,时间越短越好
- LFU关注访问次数,次数越多越好
全局页面置换算法
页面置换算法
原文:https://www.cnblogs.com/bGpi/p/14487305.html