【问题标题】:LRU cache algorithmLRU 缓存算法
【发布时间】:2020-05-28 00:26:46
【问题描述】:

我需要一个用于 4 路关联缓存的 LRU 算法,每组有额外的 5 位来指示应该驱逐哪一行。

       -------------------------------------
Set x: | line_0 | line_1 | line_2 | line_3 |
       -------------------------------------
      -----------------------------------------
      | bit_4 | bit_3 | bit_2 | bit_1 | bit_0 |
      -----------------------------------------

起初,我试图将我的问题分解为更小的问题。 只有两行,我会同时触发与当前使用的行相对应的位,将其他行设置为 0。

受害者将是位设置为 0 的线路(前提是该设置已满)。

我想我可以在 4 路缓存中使用它,这些缓存具有位 bit_4bit_3bit_1bit_0 对应于 line_0line_1line_2line_3 和中间位表示最近使用哪一侧。很快我意识到它不够精确。 IE。在序列line_0line_2line_3line_1 之后,位将是:10101,这表明左侧最近被引用(这是真的)但这并不一定意味着那一侧'最近最少被引用。

我将非常感谢任何提示。

【问题讨论】:

  • 非常感谢您的帮助,此应用程序提供了出色的缓存模拟,但不一定能解决我的问题。我确实理解它是如何工作的,但我似乎不知道如何使用 5 位来指示最近最少使用的行。

标签: algorithm caching lru


【解决方案1】:

为了始终如一地找到最近最少使用的项目,您需要跟踪最近使用 4 个缓存行的顺序。

有4个!可能的订购。 4!有 24 种可能性,额外的 5 位有 32 种可能的配置,所以你有足够的位(耶!)。但是,您没有太多额外的位,因此您不能真的期望订单的编码非常容易使用。

在我的脑海中,我想我会这样做:

  • 2 位最近最少使用的项目:0-3。如果需要,这是要驱逐的。
  • 2 位表示第二个最近最少使用的项目:0-3
  • 1 位用于第三个最近最少使用的项目。只有两种可能,因为其他两种已经被使用了。 0 表示编号较小的剩余缓存行。
  • 0 位用于最近使用(第 4 次最近使用)。只剩下一个,因此您无需存储任何内容即可知道是哪一个。

【讨论】:

  • 这真的很有帮助!尝试重新实现我的算法时,我想“好的,但是如果使用的这些行之一是 0 会发生什么?我怎么知道它是否真的被访问过?”我意识到我可以使用一些设置为 1 的脏位(如果我错了,请纠正我)来指示其中有多少行被实际修改!
  • 为什么不只存储排列索引呢?无需摆弄比特。
  • 没错,我的解决方案效率很低。所以另一个想法是创建类似 table 的东西,我会将 1-24 的数字与特定的排列相关联(实际上并未实现它)。如果不是我的集合中的所有行都有效,我想可以选择一个随机排列来存储最近访问的行的正确顺序(即访问 line_0 时 line_3 任何 xx30 排列都适合,因为前两行同样最少最近访问过。所以我要做的是描述每个可能的转换的步骤。有没有更有效的方法来做到这一点?
  • @Dialectus 没有太大区别,但最好尽量减少实现中所需的查找表数量。
  • @wkkuna 是的,无效行的顺序无关紧要,只要您先使用它们。实施将需要 2 个转换函数。 HIT: State, Line -> State,用于在缓存命中后获取下一个状态,还有一个 MISS: State -> State, Line,用于在缓存未命中后获取新状态和要驱逐的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2011-05-25
  • 2011-03-02
  • 1970-01-01
相关资源
最近更新 更多