Pseudo LRU背后的逻辑是使用更少的位并加速块的替换。逻辑给出为"令1表示左侧比右侧更近,而0则反之亦然" 但我无法理解下图中给出的实现:
详情请见:http://courses.cse.tamu.edu/ejkim/614/CSCE614-2011c-HW4-tutorial.pptx
答案 0 :(得分:5)
我也在研究Pseudo-LRU。 这是我的理解。希望它有用。
“点击CL1”:指向CL1,然后点击 LRU状态(B0和B1)被更改为通知CL1最近被引用。
“点击CL0”:对CL0有一个指示,然后命中 更新LRU状态(B1)以通知最近使用CL0(比CL1)
“小姐; CL2替换” 有一个未命中,请求LRU替换索引。 作为当前状态,选择CL2。 LRU状态(B0和B2)被更新以通知最近使用的CL2。 (这也是因为下一次更换将是CL1)
答案 1 :(得分:0)
我知道已经有一个明确解释照片的答案,但我想发布我的思维方式来实现快速伪LRU算法,它比传统LRU更有优势。
从内存的角度来看,如果有 N 对象(指针,32/64位值),则需要 N-1 标志位和 HashMap 用于存储对象的信息(指向数组中实际地址和位置的指针),用于查询缓存中是否存在元素。它不使用比传统LRU更少的内存,实际上它使用 N-1辅助位。
优化来自cpu时间。比较一些标志实际上没有时间因为它们是位。在经典LRU中,您必须具有允许插入/删除的某种结构,并且您可以快速获取LRU(可能是堆)。对于通常的操作,该结构采用 O(log(N)),但是值之间的比较也是昂贵的。所以最终你得到的每个操作的复杂度为O(log(N)^ 2),而不是Pseudo-LRU的O(log(N))。
即使Pseudo-LRU在缓存未命中时并不总是将LRU对象取出,实际上它似乎表现得相当不错并且不是主要缺点。