结构推理
要把50*50的数组元素初始化为“0”。数组中的每个元素占用2个字节。假定页面尺寸为200个字节,规定数组中的元素按行的顺序存放,系统只分配给该作业2个内存块用于数组初始化。作业开始运行时,除程序已经在内存外,数据均未进入。试问下面给出的两个程序在运行时各会发生多少次缺页中断?
程序1:
main( )
{
int a[50,50];
inti, j;
for(i=0;i<50;i++)
for(j=0; j<50; j++)
a[i,j]=0;
}
程序2:
main( )
{
int a[50,50];
inti,j;
for(j=0; j<50; j++)
for(i=0;i<50;i++)
a[i,j]=0;
}
【正确答案】按题目规定,数组中的元素按行的顺序存放,也即有形式:
a[0,0] a[0,1] a[0,2] …… a[0,49]
a[1,0] a[1,1] a[1,2] …… a[1,49]
a[2,0] a[2,1] a[2,2] …… a[2,49]
a[48,0] a[48,1] a[48,2] …… a[48,49]
a[49,0] a[49,1] a[49,2] …… 2[49,49]
数组a的一行要占用100个字节(一行50个元素,每个元素2个字节),因此一个内存块(200个字节)里能够放入该数组的两行元素。另外,作业开始运行时数组都不在内存里。因此开始运行时,通过缺页中断调进一页,这一页就是数组a的两行。程序1是按行来对数组a的元素进行初始化的。所以,通过缺页中断调进来一页,就能够完成对数组a两行元素的初始化。例如第一次缺页中断,读进两行:
a[0,0] a[0,1] a[0,2] …… a[0,49]
a[1,0] a[1,1] a[1,2] …… a[1,49]
并能够完成对这两行100个元素的初始化。由于以总共有50行,所以只需要通过25次缺页中断就可以将它们一一调入,从而完成对整个数组元素的初始化。程序2是按列来对数组a的元素进行初始化的。通过缺页中断进来一页,只能够完成数组a两行中的两个列元素初始化。例如第一次缺页中断,读进两行:
a[0,0] a[0,1] a[0,2] …… a[0,49]
a[1,0] a[1,1] a[1,2] …… a[1,49]
它只能完成对元素a[0,0]和a[1,0]的初始化。为了完成该列下面两个元素a[2,0]和a[3,0]的初始化,就需要把它们所在的行通过缺页中断调入才行。于是,完成一列元素的初始化,必须通过25次缺页中断才能完成。数组a共有50列,故按照程序2的编制方法,总共需要25*50=1250次缺页中断,才能完成数组a的初始化工作。
【答案解析】