【问题标题】:Counting page transfers between disk and main memory计算磁盘和主存之间的页面传输
【发布时间】:2012-12-12 22:39:59
【问题描述】:
for I := 1 to 1024 do
    for J := 1 to 1024 do
        A[J,I] := A[J,I] * B[I,J]

对于给定的代码,我想根据以下假设计算在磁盘和主内存之间传输了多少页:

  • 页面大小 = 512 字
  • 主内存中不能超过 256 页
  • LRU 替换策略
  • 所有二维数组大小 (1:1024,1:1024)
  • 每个数组元素占1个字
  • 二维数组以行优先顺序映射到主存中

我得到了解决方案,我的问题源于此:

A[J,I] := A[J,I] * B[I,J]

writeA := readA * readB

请注意,每个 J 循环有 2 次传输改变,1 次传输 只会改变每个 I 循环。

1024 * (8 + 1024 * (1 + 1)) = 2105344 次转移

所以每次使用时都会读取 B 的整行,因此我们 将整行计算为已传输(8 页)。但由于我们只阅读 每个A行的一部分(1个值)我们在传输的时候,我们只抓取1个 每次页面。

所以我想弄清楚的是,我们如何获得每次读取 B 时传输 8 个页面,但每次读取和写入 A 时只传输 1 个页面?

【问题讨论】:

    标签: arrays paging virtual-memory


    【解决方案1】:

    我并不奇怪你会感到困惑,因为我当然是。

    部分混淆来自于将数组标记为 1:1024。我不能这样想,我将它们重新标记为 0:1023。

    我采用“行优先顺序”表示 A[0,0] 与 A[0,511] 位于同一磁盘块中。下一个块是 A[0,512] 到 A[0,1023]。然后 A[1,0] 到 A[1,511]... 和 B 的排列相同。

    当内部循环首先执行时,系统将获取包含 A[0,0] 的块,然后是 B[0,0]。随着 J 的增加,所引用的 A 的每个元素都将来自一个单独的磁盘块。 A[1,0] 与 A[0,0] 位于不同的块中。但是只有每个被引用的第 512 个 B 元素将来自不同的块; B[0,0] 与 B[0,511] 位于同一块中。因此,对于内部循环的一次完整迭代,1024 次计算,将从 A 获取 1024 次块,从 A 写入 1024 次脏块,从 B 获取 2 次块。总共 2050 次访问。我不明白为什么您的答案说将从 B 提取 8 次。如果 B 未在 512 字边界上对齐,则每个周期将从 B 提取 3 次;但不是 8。

    对于外循环中的每个 I 值,都会发生相同的模式。假设 B 是 512 字对齐的,那么读取和写入的总块数为 2050*1024 = 2099200。

    我完全准备好让别人指出我明显的大器晚成——他们通常会这样做——但你得到的解释对我来说似乎是错误的。

    【讨论】:

    • 我在想 B 会是 2 而 A 会是 1,这整个问题令人困惑,我已经在这一点上继续前进了。感谢您的尝试
    • 我想也许我应该澄清一下他所说的行主要顺序是什么意思。行优先顺序是指编译器将二维数组映射到内存的方式。 Row-major 将在进入下一列之前填充一行。 Column-major 则相反,它将在移动到下一列之前填充一列。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多