无法理解 Belady 的异常情况
Posted
技术标签:
【中文标题】无法理解 Belady 的异常情况【英文标题】:Can't understand Belady's anomaly 【发布时间】:2011-06-15 13:51:01 【问题描述】:所以 Belady 的异常指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,我们会遇到更多页面错误。
我的直觉告诉我们,当我们添加更多的页面空间时,我们应该减少或最多相同数量的页面错误。
如果我们将 FIFO 队列视为管道,那么添加更多页面空间就像让管道变得更大:
____
O____O size 4
________
O________O size 8
那么,为什么会出现更多页面错误?我的直觉是,使用更长的管道,您需要更长的时间才能开始出现页面错误(因此,使用无限管道,您将没有页面错误),然后您将遇到同样多的页面错误,并且通常与较小的管道一样。
我的推理有什么问题?
【问题讨论】:
不确定您在此处寻找的确切内容 - WP 页面有一个实际示例:en.wikipedia.org/wiki/Belady's_anomaly 你读过Wikipedia article吗?它被称为异常,因为它与大多数人的直觉背道而驰。 :) 在这种特殊情况下,拥有更多页框会导致算法将页面保留更长时间,最终导致稍后使用频率降低,并且它们不会足够快地从 FIFO 中退出以释放空间对于最终需要的页面。但是我不知道您可以从中获得一般的直觉。这就是可能发生的事情。 “在这种特殊情况下,拥有更多页框会导致算法将页面保留更长时间,最终导致以后使用频率降低”我不明白这会产生什么影响。为什么根本不把它们放在内存中会更好(当你有一个更小的管道时会发生什么) 吞噬:在这种情况下,当然会更好,但 FIFO 无法预测未来。你看过***上的例子吗? 【参考方案1】:在使用 FIFO 时,增加页数会增加某些访问模式中的错误率的原因是,当您有更多页时,最近请求的页可以在 FIFO 队列的底部停留更长时间。
考虑这里的***示例中第三次请求“3”: http://en.wikipedia.org/wiki/Belady%27s_anomaly
页面错误用“f”标记。
1:
Page Requests 3 2 1 0 3 2 4 3 2 1 0 4
Newest Page 3f 2f 1f 0f 3f 2f 4f 4 4 1f 0f 0
3 2 1 0 3 2 2 2 4 1 1
Oldest Page 3 2 1 0 3 3 3 2 4 4
2:
Page Requests 3 2 1 0 3 2 4 3 2 1 0 4
Newest Page 3f 2f 1f 0f 0 0 4f 3f 2f 1f 0f 4f
3 2 1 1 1 0 4 3 2 1 0
3 2 2 2 1 0 4 3 2 1
Oldest Page 3 3 3 2 1 0 4 3 2
在第一个示例中(页面较少),有 9 个页面错误。
在第二个示例中(有更多页面),有 10 个页面错误。
使用 FIFO 时,增加缓存的大小会改变删除项目的顺序。在某些种情况下,会增加故障率。
Belady 的异常没有说明故障率与缓存大小有关的总体趋势。所以你的推理(关于将缓存视为管道)在一般情况下没有错。
总结: Belady's Anomaly 指出,可以利用这样一个事实,即较大的缓存大小会导致缓存中的项目在 FIFO 队列中比较小的缓存大小更晚被提升,从而导致较大的缓存大小在特定(并且可能很少见)的访问模式。
【讨论】:
但是当 3 第二次被访问时,在第二种情况下它在缓存中,而在第一次它不是 你能解释一下这个例子吗?示例中的这些数字对我来说没有任何意义。看不到模式,明白他们的意思:( 明白了...感谢this演讲...youtube FTW :) 会不会出现在FIFO以外的算法中? @Olhovsky,重新“底部”;他们不应该在访问时被带到顶部吗?【参考方案2】:只有当当前被引用的页面是最后从主内存中删除的页面时,才在 FIFO 方案中发生 Belady 异常。只有在这种情况下,即使你增加了更多的页面空间,你也会有更多的页面错误。
【讨论】:
它只发生在 FIFO 中吗?【参考方案3】:这个说法是错误的,因为它过于笼统:
Belady's Anomaly 指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,我们会遇到更多页面错误
这是一个修正版:
“Belady 异常指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,一些内存访问模式实际上会导致更多页面错误。”
换句话说...是否观察到异常取决于实际的内存访问模式。
【讨论】:
这种情况只发生在先进先出算法中吗? 随机页面替换算法怎么样?它是否患有 Belady 异常? @sameerkn 我会说它没有。使用随机页面替换,每次无论内存访问模式时,行为都是随机的。它的故障频率也是一个随机变量。添加更多空间不会预期平均会导致更多页面错误... 但是如果 RPR 算法模仿 Belady Anomaly 至少有一次,那么该算法就被称为异常。 FIFO 并不总是受到异常的影响。考虑一下如果 RPR 算法模仿 FIFO 算法会怎样?【参考方案4】:Belady的异常出现在页面替换算法不遵循堆栈算法。即帧较少的页面应该是帧较多时页面的子集。在增加页面帧时,之前存在的页面帧必须是那里。这有时会发生在 FIFO 中,甚至是随机页面替换,但不是 LRU 或最优的。
【讨论】:
【参考方案5】:即使在阅读了 Wikipedia 文章并接受了答案后,我也无法理解 belady 异常。写完痕迹后,我有点明白了。在这里我想分享一下我的理解。
理解belady异常的关键。
与 LRU 不同,FIFO 只是推出最旧的元素,而不管 频率。因此,在 FIFO 中停留的时间更长意味着成为 驱逐。从这里开始,我将 3 和 4 页 FIFO 队列称为 FIFO3 和 FIFO4。
为了理解***的例子,我把它分成了两部分。当 FIFO3 赶上 FIFO4 时,当 FIFO3 超过 FIFO4 时。
9日FIFO3如何赶上FIFO4
查看两个 FIFO 中的 3。在 FIFO3 中,3 在 4 日被驱逐并在 5 日返回。所以它在 8 日仍然存在并且缓存命中发生了。 在 FIFO4 中,3 在 5 日被 HIT,但是这个缓存命中使 3 停留更长时间并在 7 日被驱逐,就在 8 日的下一个 3 之前。
2 与 3 相同。第二个 2(6th) 是 FIFO3 上的 MISS 和 FIFO4 上的 HIT,但第三个 2(9th) 是 FIFO3 上的 HIT 和 FIFO4 上的 MISS。 这样想可能会有所帮助。在 FIFO3 上,3 于 5 日更新,因此停留时间更长,直到 8 日。在 FIFO4 上,3 是旧的,并在 7 号被驱逐,就在下一个 3 到来之前。
FIFO3 如何超越 FIFO4
因为 FIFO4 的 8 号、9 号有 2 次缓存未命中,所以 FIFO4 中的 4 号在 11 号被下推并驱逐。 FIFO3 12 号仍然保留 4,因为 8 号、9 号有缓存命中,所以 4 没有被下推。 我认为这就是为什么***的文章说“Penny Wise, Pound Foolish”
结论
FIFO 是一种简单朴素的算法,不考虑频率。 通过将 LRU(最近最少使用)应用于 Wikipedia 的示例,您可能会得到更好的理解。在 LRU 中,4 优于 3。
【讨论】:
以上是关于无法理解 Belady 的异常情况的主要内容,如果未能解决你的问题,请参考以下文章