置换的东西是页,当页的空间不够时,我们需要将一些内存中的页置换到外存中但是到底如何选择,需要使用算法实现
一、局部置换算法
置换页面的选择范围只局限于当前进程占用的物理页。
1、最优页面置换算法(OPT)
把最后要使用的页置换出来。
评价:
- 无法实现,因为无法预知未来。但是可以用来评估其他算法的效率
2、先入先出算法(FIFO)
链表记录每一页,链首记录的页在物理内存中呆的时间最长,链尾最短。把链首元素置换出去,新加的页加在链尾
评价:
- 实现简单
- 性能较差,置换出去的可能是使用最多的页
3、最近最久未使用算法(LRU)
选择最长时间没有被引用的页面的页面
缺页时计算内存每个页面最近一次的使用的时间,使用链表或栈的压入抽出,链表首最近的
评价:
- 使用栈和链表维护开销很大(在抽出栈和链表中的元素的时候需要遍历栈和链表)
- 很像最优置换算法
- 无法实现
以上算法基本无法实现
1、时钟置换算法(Clock)
对页面访问情况进行大致访问
在页表项增加访问位
页面组织成环形
- 页面装入内存,访问位初始为0
- 访问内存(读/写)时,访问位置1
- 缺页时,从指针当前位置顺序检查环形链表,访问位为0,置换该页,新装入的页的访问位置1;访问位为1,置访问位为0,指针移动到下一页,直到找到可置换的页面
2、改进后的时钟置换算法
添加一个修改位,当修改位和访问位都为0的时候置换,其他与原来的时间置换算法相同,这个以后再看看
3、最不常用算法(LFU)
使用次数最少的页被置换
Belady现象:
采用FIFO等算法时,可能出现分配的物理页面增加,缺页次数反而升高的异常现象
原因:
FIFO算法的置换特征与
LRU算法没有Belady想想
总结
LRU & FIFO & Clock