计算机组成原理 | 替换算法

99 阅读4分钟

替换算法

替换算法也称为淘汰算法,如果cache已装满数据,当新的数据块要载入时,必须选择一个数据块替换,如果替换数据块里有脏数据(如果新写入cache中的数据与主存中的原始数据不一致,则称这部分为脏数据(Dirty Data)。),还需要把淘汰的数据同步到主存中。

替换算法的分类

算法名简称
先进先出算法FIFO
最不经常使用算法LFU
最近最少使用算法LRU
随机替换算法RAND

先进先出算法FIFO

基本思想:按照数据进入cache的先后顺序决定替换的顺序,即在需要进行替换时,选择最先被载入cache的行进行替换。

硬件要求:需要记录每个cache行载入的cache的时间戳或时间技术,以方便替换时比较先后顺序。

优缺点

优点缺点
FIFO算法系统开销小存在访问的局限性,可能会把最早进入cache经常使用的块替换,可能导致cache的命中率不高

例:假设某程序访问7块信息,cache分为4行,采用全相联映射方式。程序访问的块地址流为1、2、3、2、1、3、1、4、4、5、6、7、5、6、7、5,以下是FIFO算法是访问过程图。

计算机组成原理-FIFO.drawio

从上图可以算出, 缺失次数:7次;命中次数:9次;FIFO算法的命中率 = 9/16 x 100%=56.25%

最不经常使用算法LFU

基本思想:将访问次数最少的cache行淘汰。

硬件要求:需要设置一个淘汰计数器,其硬件成本较高。新载入的cache行从0开始计数,每命中访问一次,被访问行的计数器加1。需要替换时,对所有的淘汰行的计数值进行比较,将计数值最小的行替换。

缺点LFU算法的不足是淘汰计数器记录的是cache行的历史访问统计情况,并不能严格要求反映最近访问情况。可能会出现最近访问过的cache行是历史访问最少的,该行被调出后,又立刻需要访问,就不能充分利用时间局部性

例:假设某程序访问7块信息,cache分为4行,采用全相联映射方式。程序访问的块地址流为1、2、3、2、1、3、1、4、4、5、6、7、5、6、7、5,以下是LFU算法是访问过程图,其中(数字)表示命中次数,每次命中则计数值加1。

注意:需要替换或淘汰的计数值相等时,可以采用随机替换算法或FIFO算法,本例题用FIFO算法。

计算机组成原理-LFU.drawio

从上图可以算出, 缺失次数:11次;命中次数:5次;LFU算法的命中率 = 5/16100%=31.25%

从题中可以看出,从结果来看,这种算法存在很大弊端。从地址流5、6、7、5、6、7、5存在抖动现象,即刚被替换的块又被访问。

最近最少使用算法LRU

基本思想:将近期内最近未被访问的行淘汰。

硬件要求:每行也需要设置一个计数器cache每命中一次,对应的命中行计数器清零,其他各行计数器加1,因此它是未访问次数计数器。当需要替换时,比较各特定行的计数值,将计数值最大的行换出。保护了刚载入的cache的新数据,使cache有较高的命中率。

优点:基于“局部性原理”,近期被访问的主存块,在不久的将来很有可能再次被访问,因此实际运行效果好,cache命中率高。

缺点:硬件实现的难点主要是快速比较多行计数器,要找到计数值最大的cache行,具体实现是需要较多比较器进行并发比较。

例:假设某程序访问7块信息,cache分为4行,采用全相联映射方式。程序访问的块地址流为1、2、3、2、1、3、1、4、4、5、6、7、5、6、7、5,以下是LRU算法是访问过程图,其中(数字)表示未访问次数计数值每次命中清零否则自动递增

注意:需要替换或淘汰的计数值相等时,可以采用随机替换算法或FIFO算法,本例题用FIFO算法。

计算机组成原理-LRU.drawio

从上图可以算出, 缺失次数:7次;命中次数:9次;LRU算法的命中率 = 9/16 x 100%=56.25%,整体来说,性能是比较高的,cache访问率高,利用了"局部性原理"。

随机替换算法RAND

基本思想:在需要进行替换时,从特定的行中随机地选取一行进行替换。

硬件要求:硬件实现最简单,而且速度比其他几种策略更快。

缺点:随意换出的数据很可能马上又要用,从而降低命中率和cache工作效率。但这个缺点会随cache容量增大而减弱。在虚拟存储器的TLB表中为了提高速度,就使用的随机替换算法