有一矩阵“int a[50][50]”以行为序进行存储,有一个虚拟存储系统,物理内存共有 3页,其中1页用来存放程序,其余2页用于存放数据。假设程序已在内存中占1页,其余 2页空闲。
程序A:
for(i=0; i<=49;i++)
for(j=0; j<=49;j++)
A[i][j]=0;
程序B:
for(i=0; i<=49; i++)
for(j=0; j<=49; j++)
A[i][j]=0;
若每页可存放50个整数,执行程序A会发生 (52) 次缺页,执行程序B会发生 (53) 次缺页。
(53)处填()。
A.50
B.500
C.2000
D.2500
参考答案:D
解析:
由题目中所给条件可知,数组A有50×50个整数,系统中共有2个内存页用于存放数据,信息数组中的元素按行编址。
若每页可以存放50个整数,则一个内存页中可以存放1行数组元素,对于程序A,数组元素的访问顺序为:
A[0][0],A[0][1]…A[0][49]
A[1][0],A[1][1]…A[1][49]
┇
A[49][0],A[49][1]…A[49][49]
显然,程序A对数据A的访问顺序与存储顺序一致,也是按行进行的。因此程序A每访问1行数据元素都会产生一次缺页中断,则访问整个数据会产生50次缺页中断。
对于程序B,数组元素的访问顺序为:
A[0][0],A[1][0]…A[49][0]
A[0][1],A[1][1]…A[49][1]
┇
A[0][49],A[1][49]…A[49][49]
显然,程序B对数据A的访问顺序与存储顺序不一致,因此程序B每访问1个数据元素都会产生一次缺页中断,则访问整个数据会产生2500次缺页中断。
经过上述分析,不得不引人深思,平时写程序的过程中,一个很细微的改变,可能导致计算机工作量数十倍的增长。