我要谈论的话题是缓存、映射和缓存未命中,以及当所有块已满时缓存块被替换的顺序。
有最近最少使用算法、先进先出算法、最不经常使用算法和随机替换等算法...
但实际的CPU缓存使用哪些算法呢?或者你可以使用全部算法,...操作系统会决定使用哪种最佳算法吗?
编辑:即使我选择了一个答案,任何进一步的信息也是欢迎的;)
另一个有趣的机制提到了,它超越了经典的LRU,这就是自适应填充策略。这里有一个相当不错的分析-http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/,但简而言之(如果博客是正确的,他的结果似乎很匹配),缓存动态选择两个LRU策略之间进行切换,试图决定行是否会被重用(并且是否应该保留)。
我猜这可能在某种程度上回答了你关于多个LRU方案的问题。实施几个方案可能在硬件方面很困难和昂贵,但是当您拥有复杂到具有参数的策略时,可以使用诸如动态选择、集合对决等技巧。
针对2路关联性,真正的LRU可能是最常见的选择,因为它具有良好的行为(顺便说一下,在只有两条路时与二叉树pLRU相同)。例如,Fairchild Clipper Cache和Memory Management Unit在其2路缓存中使用了LRU。FIFO比LRU稍微便宜一些,因为替换信息仅在写入标签时更新,也就是插入新缓存块时,但其行为比基于计数器的伪随机替换要好(后者的开销更低)。HP PA 7300LC在其2路L1缓存中使用了FIFO。
Itanium 9500系列(Poulson)在L1和L2数据缓存、L2指令缓存以及L3缓存中使用NRU。 L1指令缓存记录为使用LRU。对于Itanium 2 6M(Madison)中的24路L3缓存,每个块都提供了一个用于NRU的位,访问块会设置其所在集合和路的位(“Itanium 2 Processor 6M:Higher Frequency and Larger L3 Cache”,Stefan Rusu等人,2004)。这类似于时钟页面替换算法。
我记得在别处读到过,当所有位都设置时(而不是保留设置最后一位的那个位),位将被清除,并且受害者是通过查找第一个未设置的位来选择的。这具有硬件优势,可以仅在缓存未命中时读取信息(该信息存储在L3标记旁边但不同的数组中);缓存命中时可以简单地设置相应的位。顺便说一下,这种类型的NRU避免了真正的LRU的一些不良特性(例如,在某些情况下,LRU会退化为FIFO,在其中一些情况下,甚至随机替换也会增加命中率)。