[原创]二维数组与缺页中断率
*/ --------------------------------------------------------------------------------------*/ 出自: 编程中国 [url=http://www.]http://www.[/url]
*/ 作者: 蓝心稻草 E-mail:[email=out_of_blue@]out_of_blue@[/email] QQ:360852129
*/ 时间: 2007-11-30 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
我们知道二维数组在概念上是二维的,但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。
在C语言中,二维数组是按行排列的。
这就带来了一个问题。下面的两个程序段:
/*程序段一,以下称A*/
for(i=0;i<n;++i)
for(j=0;j<n;++j)
a[i][j]=k;
/*程序段二,以下称B*/
for(j=0;j<n;++j)
for(i=0;i<n;++i)
a[i][j]=k;
(k是已知常数)
分别会给页面调度带来什么影响呢?我们取n为64,并实现把数组置零(即k=0)为方便说明,我们假定分给这个程序的主存块数只有一块,页面的尺寸为每页64个字,数组中的元素每一行存放在一页中,开始时第一页在主存。那么,显然采用A的编程方式将会产生(64-1)次缺页中断,而采用B由于没执行一次a[i][j]=k都会造成一次缺页中断,共计(64×64-1)次。很明显,随着n值的增大这两个数的差值是惊人的。
现以a[3][3]为例,由于c语言二维数组是按行排列的,若采用A,当执行赋值完a[0][2]时产生中断,到a[1][2]时又一次中断。而采用B的话,由于每次i值的改变引起的并不是存储器的连续地址变换,每执行赋值就会产生一次缺页中断,而与页面调度的算法是无关的。
说了这么多,其实这种小程序是否有机会去影响页面调度都是很难说的。主要是想说明,能用A的时候大家不要用B的方法。当然也很少有人无聊的用B。(我在这白废话了~~)
小弟初学c,很多不对的地方高人指教,但请不要骂我!!因为我发现坛里好多高手并不能很谦虚的给我们指教,总爱摆份架子~你们也是从菜鸟起步的呐~谢了^_^
[[italic] 本帖最后由 lanxindaocao 于 2007-11-30 15:16 编辑 [/italic]]