结构推理 要把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的初始化工作。
【答案解析】