页面置换算法是在请求分页存储时,调页时候会用到的。页面置换算法的目标是,尽可能减少换入换出次数。常见的页面置换算法有:最优页面置换算法、先进先出算法、最近最久未使用算法(LRU)、时钟页面置换算法、二次机会算法和最不常用算法。我们还会介绍Belady现象。
算法介绍
最优页面置换算法
特点:
- 替换未来很长时间都不会被访问的页面
- 可保证最低缺页率
- 由于需要预知未来,所以很难实现
- 可用作其他算法的评价依据
举例:
Time | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Request | c | a | d | b | e | b | a | b | c | d |
0 | c | c | c | c | c | c | c | c | c | c |
1 | a | a | a | a | a | a | a | a | a | |
2 | d | d | e | e | e | e | e | d | ||
3 | b | b | b | b | b | b | b | |||
缺页 | × | × | × | × | × | × |
2. 先进先出算法(FIFO)
特点:
- 选择在内存中驻留时间最长的页面置换,使用链表实现
- 实现简单
性能差,会出现Belady现象
- 最近最久未使用算法(LRU)
特点:
选择最久未被使用的页面
- 它是最优算法的近似,对历史推测未来,依据程序局部性
使用栈来实现,但是需要较多的硬件支持,增加成本
举例:
Time | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Request | c | a | d | b | e | b | a | b | c | d |
0 | c | c | c | c | e | e | e | e | e | d |
1 | a | a | a | a | a | a | a | a | a | |
2 | d | d | d | d | d | d | c | c | ||
3 | b | b | b | b | b | b | b | |||
缺页 | × | × | × | × | × | × | × |
4. 时钟页面置换算法(NRU)
特点:
- LRU的近似,FIFO的改进
- 用到页表项中的访问位
- 页面组织成环形链表,指向最老的页面
中断产生时,若指向的页面访问位为0,立即淘汰;若为1,则往下移动
- 二次机会算法
特点:
利用dirty bit区分读写
对于只有读操作的页,若置换,只需释放,若有写操作,则需放回磁盘
- 最不常用算法(LFU)
特点:
选择访问次数最少的页置换
- 计数器来统计
Belady现象
在FIFO算法中,当分配的物理页越多,产生缺页现象也会增多
原因:没有考虑到内存访问的动态性
比较
- FIFO和LRU本质均为先进先出,LRU考虑了页面最近访问时间
- clock近似LRU,clock开销小
- FIFO开销小,但是会出现Belady现象