以下是有关bit-plru的描述
Bit-PLRU为每个高速缓存行存储一个状态位。我们称这些位为MRU- 位。每次访问某行时,都会将其MRU位设置为1,表示该行是最近使用的。每当一组状态位的最后剩余0位设置为1时,所有其他位都将重置为0。在高速缓存未命中时,将替换MRU位为0的索引最低的行。
我认为lru和bit-plru的替换策略相同,丢失率也相同。
我的原因:At cache misses, the line with lowest index whose MRU-bit is 0 is replaced.
具有最低索引的行表示最近最少使用,因此它的mru-bit肯定为零(因为最近没有使用,所以不能为1)。那么,mru-bit是多余的吗?
如果我的原因是错误的,谁能给我一些原因或例子,告诉我bit-plru和lru之间的区别是什么?为什么bit-plru可以提供更好的性能(丢失率)?
谢谢!
答案 0 :(得分:2)
最近最少使用表示访问时间最久的行。但是在高速缓存上下文中,跟踪访问以始终知道哪个是最旧的访问可能很复杂。存储每个块的访问顺序至少需要ceil(log 2 ( n !))位,或者很可能是 n × log 2 n位,这对于 n 来说很小,而且更易于管理。每当访问内存引用时,都必须将其从订单列表中删除,放在顶部,其余的更新。在一个周期中完成此操作可能很复杂。
这是开发伪LRU方法的原因。他们保证弹出“古老”的路线,但不能保证最古老的路线。
请考虑您问题的bit-LRU的示例。我们假定初始设置状态如下。
line status real order
(index) (MRU)
0 0 3 LRU
1 1 0 MRU
2 1 1
3 0 2
不存储真实订单,但是我们将使用它来了解算法的行为(最小的是最小的)。
现在,假设我们访问现有的第0行。状态变为
line status real order
(index) (MRU)
0 1 0 MRU
1 1 1
2 1 2
3 0 3 LRU
假设这之后是一个未命中,因此我们应用该方法并替换第3行:
每当将一组状态位的最后剩余的0位设置为1时,所有其他位都将重置为0。
line status real order
(index) (MRU)
0 0 1
1 0 2
2 0 3 LRU
3 1 0 MRU
因此,该算法已正确弹出LRU(第3行)。
假设还有另一个小姐。该算法指出:
在高速缓存未命中时,将替换MRU位为0的索引最低的行。
因此第0行将被替换。但是第二行不是不是 LRU。它甚至是古代行中“最年轻”的行。但是具有最低的索引。
要弹出另一条更好的线路,则需要有关访问时间的其他信息。
也许可以简单地添加一些弹出中的随机性。但是找到真正的LRU更复杂。
请注意,拥有伪LRU的更好方法。例如,Tree-LRU更好,但是仍然不能保证将使用真正的LRU。
对于实际应用,pLRU的丢失率与真实LRU相似,但简单得多。
但是,即使是真正的LRU也不总是最好的策略,如果经常访问某行,则很有可能继续访问该行,即使它是LRU也不应替换。
因此,最有效的方法是通过跟踪访问次数并考虑仅访问一次的行和访问两次或更多次的行的不同方式来扩展pLRU。这样,每当必须弹出一条线时,首选仅访问一次的线。