我正在阅读《操作系统概念》(第9版),并且在第443页上,我发现了有关需求分页及其对流程时间的影响的有趣考虑。它是这样的:
假定页面大小为128个字。考虑一个C程序,其功能是将128 x 128数组的每个元素初始化为0。以下代码是典型的:
int i, j; int data[128][128]; for (j = 0; j < 128; j++) for (i = 0; i < 128; i++) data[i][j] = 0;
对于128个单词的页面,每行占用一页。因此, 代码将每个页面中的一个单词清零,然后将每个页面中的另一个单词清零,并且 以此类推。如果操作系统分配给少于128个帧 整个程序,则其执行将导致128×128 = 16,384 页面错误。相反,假设我们将代码更改为
int i, j; int data[128][128]; for (i = 0; i < 128; i++) for (j = 0; j < 128; j++) data[i][j] = 0;
此代码在开始下一页之前将一页上的所有单词清零 页面,将页面错误的数量减少到128。
所以我尝试在我的OS上执行此操作,只是为了记录两种方法之间的时间差。首先,我们要在 Windows 10 上工作,为此测试设置的页面大小为 16 MB ,这也是我所允许的最小值。不幸的是,第一段代码是有问题的:
int main(){
const int PAGE_SIZE = 16; //MB
const int ROW_SIZE = 127;
const int COL_SIZE = 1024 / sizeof(int) * 1024 * PAGE_SIZE;
int table[ROW_SIZE][COL_SIZE];
printf("test");
return 0;
}
它编译(gcc
)并且即使在运行时也不会引发任何异常,但它不会打印test
。我认为这真的很奇怪,因为它至少应该打印一些东西。因此,我尝试对其进行调试,发现它甚至没有达到main
,但是它是接收到的信号SIGSEGV,分段错误。
我很确定这种行为必然会导致页面大小的减小,但是我无法解释自己的原因。
返回的错误代码为-1073741571
,但是我不是Windows方面的专家,起初我认为错误解析与Linux相似(我的读数也证实了这一点),因此我采用了16位低有效位,但是解析的错误代码为253
,它与任何有效的错误代码都不对应。