36

所以 Belady's Anomaly 指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,我们会遇到更多页面错误。

我的直觉告诉我们,我们应该减少或最多增加相同数量的页面错误,因为我们增加了更多的页面空间。

如果我们将 FIFO 队列视为管道,则添加更多页面空间就像使管道变得更大:

 ____
O____O  size 4

 ________
O________O  size 8

那么,为什么你会得到更多的页面错误呢?我的直觉是,使用更长的管道,您需要更长的时间才能开始出现页面错误(因此,使用无限管道,您将没有页面错误),然后您会遇到同样多的页面错误,就像通常与较小的管道一样。

我的推理有什么问题?

4

5 回答 5

37

使用 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's Anomaly 没有说明故障率与缓存大小有关的总体趋势。因此,您的推理(关于将缓存视为管道)在一般情况下没有错。

总结:Belady 的异常指出,可以利用较大的缓存大小可能导致缓存中的项目比较小的缓存大小更晚地在 FIFO 队列中提升的事实,从而导致较大的缓存大小具有更高的故障在特定(并且可能很少见)访问模式下的速率。

于 2011-01-26T01:01:02.723 回答
9

这个陈述是错误的,因为它被过度概括了:

Belady's Anomaly 指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,我们将遇到更多页面错误

这是一个更正的版本:

“Belady's Anomaly 指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,某些内存访问模式实际上会导致更多页面错误。”

换句话说……是否观察到异常取决于实际的内存访问模式。

于 2015-03-25T17:12:24.187 回答
2

Belady的异常发生在页面替换算法不遵循堆栈算法。即帧较少的页面应该是帧较多时页面的子集。在增加页面帧时,之前存在的页面帧必须存在。这有时可能会发生在 FIFO 中,甚至是随机页面替换,但不是 LRU 或最优的。

于 2017-04-06T04:37:26.243 回答
1

即使在阅读了维基百科文章并接受了答案后,我也无法理解 belady 异常。写完痕迹后,我有点明白了。在这里,我想分享一下我的理解。

理解belady异常的关键。

  • 与 LRU 不同,FIFO 只是推出最旧的元素,而不考虑频率。因此,在 FIFO 中停留的时间越长,就意味着成为驱逐的受害者。

从这里开始,我将 3 页和 4 页 FIFO 队列称为 FIFO3 和 FIFO4。

为了理解维基百科的例子,我把它分成了两部分。当 FIFO3 赶上 FIFO4 和 FIFO3 超过 FIFO4 时。

FIFO3 如何在 9 日赶上 FIFO4

在此处输入图像描述

查看两个 FIFO 中的 3。在 FIFO3 中,3 在 4 日被驱逐并在 5 日返回。所以它在 8 日仍然存在并且缓存命中发生了。在 FIFO4 中,3 在第 5 次命中,但是这个缓存命中使 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。

于 2020-11-02T12:53:55.347 回答
-3

仅当当前被引用的页面是最后从主存储器中删除的页面时,才在 FIFO 方案中发生 Belady 的异常。只有在这种情况下,即使你增加了更多的页面空间,你也会有更多的页面错误。

于 2013-05-20T17:25:49.747 回答