文章目录
- 1. 最不常用算法的工作原理
- 2.最不常用算法特征
- 3. 示例
1. 最不常用算法的工作原理
最不常用算法:注意并不是表示算法本身不常用,而是采取最不常使用页面的策略,Least Frequently Used, LFU。LRU 是最久未被访问的页,LFU 是当产生缺页中断时,它选择的是访问次数最少的页,把它淘汰出去。当缺页时,统计页访问次数,访问次数越少的页认为将来也许被访问的概率也会很少,所以把这个页淘汰出去。
基于这个原则,要记录这个页被访问多少次。当然通常想法,对每一个页都添加访问计数器,只要这个页被访问,计数器加一。在缺页的时候,查所有页的计数器,选择计数器值最小的页,给换出去。
2.最不常用算法特征
但是在操作系统里面实现,不仅要考虑操作系统本身效率,还要考虑硬件成本,即为了完成这个事情,要增加多少硬件资源。比如增加一块内存,增加一个寄存器,希望资源越少越好,这就是为什么说 LRU 算法开销大,但是 Clock 算法开销小,因为 Clock 算法只用了一个 bit。
如果为了记录页面防问次数,需要访问计数器来存,很明显硬件开销很大。如果要对计数器进行查找,当产生缺页中断时要查找最小的,如果访问页很大,链表很长,查找时间必然也就会很大,所以如果采取简单设计方法是有问题的。
跟 LRU 相比,确实有区别,LFU 考虑访问次数,LRU 考虑访问时间,时间最久未被访问页,认为这页将来是不会被访问,意味着访问时间越短,越值得留在内存里。LFU 正好相反,它是访问次数,代表访问频度,访问次数越多,意味着这个页将来也会被访问。
这个假设是否合理?
举个反例,在程序运行时候,由于初始化对页面做了很多读写操作,之后做其他事情,有可能这个页访问次数就比较少,但是由于 LFU 算法统计是整体的访问次数,在一个时间段内,它虽然在之前老的时间段访问次数很多,但在新的时间段访问次数比较少。所以说在这种情况下,依然会把这个页留在内存中,但也许它在将来一段时间内就不能访问了,所以说在某种情况下,这取决于程序的访问特征,在这种访问特征下, LFU 算法是不太合适的。
可能的改进办法?
其实也有,这里最主要的问题是没有把时间信息考虑进去,只考虑频率,如果说隔一段时间把访问次数变小,比如过段时间让它左移一位,等于除以2,这个值自然就变小,把时间考虑进去,结合这个因素使得 LFU 算法更加合理和有效。当然,这只是一些解决办法。