最近最久未使用(LRU)算法
基本思想:
利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。 即淘汰最近最长时间未访问过的页面。(往前看)
LRU置换算法的硬件支持
- 寄存器
为每个在内存中的页面配置一个移位寄存器,用来记录某进程在内存中各页的使用情况。移位寄存器表示为
R=Rn-1Rn-2Rn-3…R2R1R0
当进程访问某物理块时,要将相应寄存器的Rn-1位置成1;
同时,每隔一定时间将寄存器右移一位;
如果把n位寄存器的数看作一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。 - 栈
利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。
物理页面 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 | 5 | 2 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
物理块1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | |||||
物理块2 | 3 | 3 | 5 | 5 | 5 | 5 | ||||||
物理块3 | 1 | 1 | 4 | 4 | 2 | |||||||
是否缺页 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
缺页7次,总访问次数12次
缺页率:7/12 = 58.3%
实际上,LRU算法根据各页以前的情况,是“向前看”的,而最佳置换算法则根据各页以后的使用情况,是“向后看”的。
LRU性能较好,但需要寄存器和栈的硬件支持。
LRU是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现Belady异常。
FIFO算法基于队列实现,不是堆栈类算法。