提示:只有全相联映射和组相联映射需要考虑cache替换算法
前言
cache与主存的映射方式主要有三种:全相联映射、直接映射和组相联映射。
全相联映射是主存中一个块直接拷贝到cache中任意一行,直接映射的主存块在chche中位置=主存块号%cache总块数,组相联映射的所属分组=主存块号%分组数
从主存向cache中传一个新块,当cache满的时候,就需要使用替换算法替换cache行,因直接映射算法的规则是主存块号%cache总块数,替换的话位置也是固定的,因此直接映射不用考虑替换算法,而全相联映射和组相联映射在替换时因位置不固定,需考虑替换算法。
一、替换算法
题目:设总有4个cache块,初始整个cache为空,采用全相联方式,依次访问主存块{1,2,3,4,1,2,5,1,2,3,4,5}
1、随机算法(RAND)
若cache已满,则随机选择一块替换
红色代表cache未满可直接把主存块调入空闲cache块中
绿色代表该主存块在cache块中命中,直接访问该cache块
橙色代表主存块在cache块中未命中,此算法需随机选一块替换
未考虑局部性原理,刚调入的cache块可能很快被替换,效果很差
2、先进先出(FIFO)
优先替换最先被调入cache的主存块
红色代表cache未满可直接把主存块调入空闲cache块中
绿色代表该主存块在cache块中命中,直接访问该cache块
橙色代表主存块在cache块中未命中,此算法需选最先被调入cache块的替换
依然未考虑局部性原理,并且可能出现抖动现象,例如上例中后几个要访问的主存号对应的替换在cache块中刚替换掉就又被访问到
3、近期最少使用(LRU)
为每一个Cache块设置一个计数器,用于记录每个Cache块已经有多久未访问,当Cache满后替换计数器最大的
红色代表cache未满可直接把主存块调入空闲cache块中
绿色代表该主存块在cache块中命中,直接访问该cache块
橙色代表主存块在cache块中未命中,此算法需替换计数器最大的块
该算法一个技巧就是从这个主存块往前看,比如图中箭头的位置,前面有5,1,2,证明这三个刚被访问过,就选剩下那一个就可以了
该算法比较好的利用了局部性原理(近期被访问的主存块可能在不久的将来还会被访问到),因此淘汰最久未被访问的块非常合理,该算法的实际运行效率较高,Cache命中率高
但是如果频繁被访问的主存块数 > Cache的块数,则可能还会发生抖动现象
4、最近不经常使用(LFU)
将访问次数最少的主存块替换,每个cache行设置一个计数器,用于记录被访问过多少次,当cache满后替换计数器最小的
红色代表cache未满可直接把主存块调入空闲cache块中
绿色代表该主存块在cache块中命中,直接访问该cache块
橙色代表主存块在cache块中未命中,此算法替换计数器最小的
曾经被经常访问的主存块在未来不一定会用到,实际运行效果不好