FIFO算法、LRU算法与LFU算法

当从辅存调页至主存时,若主存已满时,需要进行主存页面之间的替换,虚拟存储器的替换算法有:FIFO算法、LRU算法、LFU算法等。

FIFO算法:

先进先出调度算法。如果一个数据是最先进入的,那么可能认为它被访问的可能性很小,当空间满的时候,最先进入的数据(队首元素)会被最早淘汰掉,并把新加入的数据插入到队尾。

它的缺点:因为FIFO置换算法与进程访问内存的动态特征是不相容的,被置换的内存页面往往是被频繁访问或者没有给进程分配足够的页面,所以FIFO算法会使得一些页面频繁地被替换和重新申请内存,导致了缺页率增加。

LRU算法:

最近最久未使用调度算法。如果一个数据在最近一段时间没有被访问到,那么可认为它在未来被访问的可能性也很小,当空间满的时候,最久没有访问的数据最先被淘汰。

它的缺点:如果是偶尔的批量访问不同的数据时其命中率就会很低。比如我频繁的访问A,接着访问不同的数据直到A被淘汰,此时我再访问A,则不得不又再次把A加入到Cache中,显然这种方式是不合时宜的,因为A已经访问了很多次了,不应该将其淘汰而把一堆只访问一次的数据加入到Cache中。

LFU算法:

最近最不常用的调度算法。应将这段时间内访问次数最少的数据替换出。为此给每个数据设置一个计数器,每访问一次,计数器的值+1。当发送冲突的时候,就找到当前计数器的值最小的那一个数据,把这个数据替换成新的元素。

例题:某虚拟存储器采用页式存储管理,使用LRU页面替换算法。若每次访问在一个时间单位内完成,页面访问的序列如下:1,8,1,7,8,2,7,2,1,8,3,8,2,1,3,1,7,1,3,7。已知主存只允许存放四个页面初始状态时4个页面是全空的,则页面失效次数是( 6 )。

LRU算法的思想:每页设置一个计数器,每次命中一页,该页对应的计数器清零,其他各页的计数器加1;需要替换时,将计数值最大的页换出,所以,对应的访问过程及相应的计数器的内容、替换结果如下:
FIFO算法、LRU算法与LFU算法(红色标记的个数即为页面失效总次数)