【发布时间】:2014-06-25 12:55:56
【问题描述】:
Pseudo LRU 背后的逻辑是使用更少的比特并加快块的替换。给出的逻辑是“让 1 表示左侧被引用的时间比右侧要晚,反之为 0” 但我无法理解下图中给出的实现:
详情请见:http://courses.cse.tamu.edu/ejkim/614/CSCE614-2011c-HW4-tutorial.pptx
【问题讨论】:
Pseudo LRU 背后的逻辑是使用更少的比特并加快块的替换。给出的逻辑是“让 1 表示左侧被引用的时间比右侧要晚,反之为 0” 但我无法理解下图中给出的实现:
详情请见:http://courses.cse.tamu.edu/ejkim/614/CSCE614-2011c-HW4-tutorial.pptx
【问题讨论】:
我也在研究 Pseudo-LRU。 这是我的理解。希望对您有所帮助。
“Hit CL1”:有一个指向 CL1 的对象,然后点击 LRU 状态(B0 和 B1)发生变化,通知 CL1 最近被引用。
“Hit CL0”:有一个指向 CL0 的对象,然后点击 LRU 状态 (B1) 更新以通知最近使用了 CL0(比 CL1)
“未命中;CL2 替换” 有一个未命中,请求 LRU 替换索引。 作为当前状态,选择CL2。 LRU 状态(B0 和 B2)被更新以通知 CL2 最近被使用。 (这也导致下一个替换将是 CL1)
【讨论】:
我知道已经有一个答案清楚地解释了这张照片,但我想发布我的想法来实现快速伪 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 对象,但在实践中它似乎表现得非常好,这不是主要缺点。
【讨论】: