计算二维数组的页面错误数

问题描述 投票:12回答:4

我正在尝试学习考试..我找到了这个例子,但不明白他们是如何得到答案的。谁能解释一下?

问题:

考虑二维数组A:int A [] [] = new int [100] [100];其中A [0] [0]在页面大小为200的分页内存系统中的位置200处。操纵矩阵的小进程位于页面0(位置0至199)中。因此,每条指令取自页面0。对于两个页面框架,使用LRU替换并假设第一个页面框架包含进程,而另一个初始为空,以下数组初始化循环会生成多少页面错误?

A:

for (int j=0;j<100;j++)
   for (int i=0; i<100; i++)
     A[i][j] = 0;

B:

for(int i=0; i<100; i++)
  for (int j=0; j<100; j++)
      A[i][j] = 0;

给出的正确答案是:a:100 x 50 = 5000b:50

我对第一部分有所了解。共有50页。 (10000/200 = 50),并且每次j更改时,都会发生页面错误。因此总共出现100个页面错误。但是为什么乘以50?为什么第二个是50?

谢谢!

我正在尝试学习考试..我找到了这个例子,但不明白他们是如何得到答案的。谁能解释一下?问题:考虑二维数组A:int A [] [] = ...

arrays operating-system paging page-fault
4个回答
7
投票

假设您的系统为您的过程分配了两个帧,这样矩阵的200 * sizeof(int)可以一次保存在内存中。矩阵的分配发生在Row Major Order中。


2
投票

此处的关键是查看从线性内存地址读取时所有数组访问的外观。为了使答案有意义,还必须假定行大(C)顺序。该问题还遗漏了单位,我们假设单位是字节(因此A必须以1字节类型保存)。

char *B = &(A[0][0]); (memory address 200)

1
投票

因此,二维数组中总共有50页是按行或按列存储的。

如果您逐行存储页面并逐行访问它们,那么您将一遍又一遍地访问同一页面,直到到达下一页为止,所以您仅切换50次页面(导致页面错误),因为有50页。


1
投票

让我们来看一个精心设计但内容丰富的示例。假设页面是大小为128个字。考虑一个C程序,其功能是初始化为0128 x 128数组的每个元素。以下代码是典型的:

© www.soinside.com 2019 - 2024. All rights reserved.