【问题标题】:Page Fault For a Code Fragment代码片段的页面错误
【发布时间】:2012-11-19 15:25:57
【问题描述】:

这不是作业问题。我今天的学期考试就来了。

此代码片段计算每个表列的平均值 t[i][j] 0<=i<18 ; 0<=j<1024

for (j = 0; j < 1024; i++) {  
   temp = 0;  
   for (i = 0; i < 18; i++) {  
      temp += temp + t[i][j];  
   }  
   cout << temp/18;
}

变量是 32 位浮点值。

变量ijtemp 存储在处理器寄存器中(因此不需要内存引用来访问 temp。主内存是字可寻址和分页的,包含 17 个帧,每个大小为 1024 个字和一个字是4字节。页面替换策略是LRU。

确定执行给定程序片段的页面错误数?答:18432

如何计算?

【问题讨论】:

  • @DavidTitarenco,您是否认为每次通过索引访问数组都会产生页面错误?
  • @aleguna 内部循环位于数组的外部索引之上,这意味着每次访问相隔 1024 个单词。由于每帧有 1024 个单词,所以我们有了。

标签: c++ operating-system


【解决方案1】:
int array[3][3] = {{0, 1, 2},
                  {3, 4, 5},
                  {6, 7, 8}};

这个数组在内存中的布局是[0, 1, 2, 3, 4, 5, 6, 7, 8],也就是

array[0][0]
array[0][1]
array[0][2]
array[1][0]
array[1][1]
array[1][2]
array[2][0]
array[2][1]
array[2][2]

这里array[1][0]array[2][0]的内存地址差为3;

所以给定一个数组a[18][1024]a[i][j]a[i+1][j] 之间的差异是 1024 字节(页面错误的大小)。因此,每次您的内部循环触发都会导致页面错误。您的内部循环触发 18*1024 次(18432)。

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2016-07-30
    相关资源
    最近更新 更多