假设您的系统为您的进程分配了两个帧,以便200 * sizeof(int)
矩阵一次可以保存在内存中。矩阵的分配发生在行主要顺序 http://en.wikipedia.org/wiki/Row-major_order#Row-major_order.
在第一个循环中A
:
for (int j=0;j<100;j++)
for (int i=0; i<100; i++)
A[i][j] = 0;
循环访问矩阵列的存储单元,例如:
A[0][0], A[2][0], A[3][0], ...A[0][2], A[0][3], A[0][4], ......
^ ^ ^
row changes
在每次迭代时行更改分配以行为主,每行占一页。所以代码A
将导致每个替代方案出现页面错误A[i][j]
访问,因此页面错误总数 = 100 * 100 / 2) = 5000。
第二个代码在哪里B
:
for(int i=0; i<100; i++)
for (int j=0; j<100; j++)
A[i][j] = 0;
每次迭代时按行循环访问矩阵的内存单元,例如:
A[0][0], A[0][5], A[0][6],...,A[1][0], A[1][7], A[1][8],...,A[2][0], A[2][9],
^ ^ ^
column changes, row are same
按行访问(读取时列发生变化仅在读取 100 次后才更改行),一次加载一行,因此当行更改(对于外循环)时会发生页错误,并且对于每个替代行访问都会发生页错误,因此页错误数 = 100/2 = 50。
我们可以用另一种方式来理解它,比如:
在行主要中,行索引更改的次数我们需要新页面来访问,因为页面数量很小,第一个 A 循环中的每个替代索引更改上的页错误行索引更改了 100*100 次,而在 B 循环中行索引更改了 100次,因此 A/B 中的页错误率 = 100*100/100 = 100,如果 A 中发生页错误数 = 50,00,则 B 中的页错误数 = 50,00/100 = 50。
同样,您可以计算页面错误的数量列主序 http://en.wikipedia.org/wiki/Row-major_order#Column-major_order并且因为矩阵的行数和列数相同,结果将相同。
我的书中给出了类似的例子:
下载 pdf:阅读第 9 章:虚拟内存部分:9.9.5 程序结构。