OS Summary 8 - 页面置换算法
Dec 29, 2018#OS
功能:当出现缺页异常,需调入新页面而内存已满时,置换算法选择被置换的物理页面
目标
最优页面置换算法 ( OPT , optimal )
置换在未来最长时间不访问的页面,理想情况
先进先出算法(First-In First-Out, FIFO)
基本思路:选择在内存驻留时间最长的页面进行置换
算法实现
- 维护一个记录所有位于内存中的逻辑页面链表
- 链表元素按驻留内存的时间排序,链首最长,链尾最短
- 出现缺页时,选择链首页面进行置换,新页面加到链尾
算法特征
- 实现简单
- 性能较差,调出的页面可能是经常访问的
- 进程分配物理页面数增加时,缺页并不一定减少( Belady 现象)
- 很少单独使用
最近最久未使用算法(Least Recently Used, LRU)
基本思路
- 选择最长时间没有被引用的页面进行置换
- 如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问
算法实现
- 缺页时,计算内存中每个逻辑页面的上一次访问时间
- 选择上一次使用到当前时间最长的页面
算法特征
最优置换算法的一种近似
LRU算法的可能实现方法
- 页面链表
- 系统维护一个按最近一次访问时间排序的页面链表
- 链表首节点是最近刚刚使用过的页面
- 链表尾节点是最久未使用的页面
- 访问内存时,找到相应页面,并把它移到链表之首
- 缺页时,置换链表尾节点的页面
- 活动页面栈
- 访问页面时,将此页号压入栈顶,并栈内相同的页号抽出
- 缺页时,置换栈底的页面
特征
开销比较大
时钟置换算法(Clock)
基本思路
仅对页面的访问情况进行大致统计
时钟算法是LRU和FIFO的折中
最不常用算法(Least Frequently Used, LFU)
基本思路
缺页时,置换访问次数最少的页面
算法实现
- 每个页面设置一个访问计数(多位计数)
- 访问页面时,访问计数加1
- 缺页时,置换计数最小的页面
算法特征
- 算法开销大
- 开始时频繁使用,但以后不使用的页面很难置换
解决方法
计数定期右移、衰减
LRU和LFU的区别
- LRU关注多久未访问,时间越短越好
- LFU关注访问次数,次数越多越好
LRU、FIFO和Clock的比较
LRU算法和FIFO本质上都是先进先出的思路
- LRU依据页面的最近访问时间排序
- LRU需要动态地调整顺序
- FIFO依据页面进入内存的时间排序
LRU可退化成FIFO
如页面进入内存后没有被访问,最近访问时间与进入内存的时间相同
LRU算法性能较好,但系统开销较大
FIFO算法系统开销较小,会发生Belady现象
Clock算法是它们的折衷
- 页面访问时,不动态调整页面在链表中的顺序,仅做标记
- 缺页时,再把它移动到链表末尾
对于未被访问的页面,Clock和LRU算法的表现一样好
对于被访问过的页面,Clock算法不能记录准确访问顺序,而LRU算法可以