页面大小的减小如何影响C程序?

时间:2018-06-30 17:34:33

标签: c windows memory-management paging

我正在阅读《操作系统概念》(第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,它与任何有效的错误代码都不对应。

0 个答案:

没有答案