计算磁盘和主内存之间的页面传输

时间:2012-12-12 22:39:59

标签: arrays paging virtual-memory

for I := 1 to 1024 do
    for J := 1 to 1024 do
        A[J,I] := A[J,I] * B[I,J]

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

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

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

  

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

     

writeA:= readA * readB

     

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

     

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

     

因此,每次使用它时都会读取整行B,因此我们就是这样   将整行计为已转移(8页)。但是因为我们只读过   当我们转移它时,每个A行(1个值)的一部分,我们只抓1   每次页面。

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

1 个答案:

答案 0 :(得分: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字的边界上对齐,那么每个周期将有3次取自B;但不是8。

对于外循环中的每个I值,都会出现相同的模式。这使得2050 * 1024 = 2099200总块读取和写入,假设B是512字对齐。

我完全准备好让某人指出我明显的大器官 - 他们通常会这样做 - 但你给出的解释对我来说似乎不对。