首页 > 解决方案 > 页面大小减小如何影响 C 程序?

问题描述

我正在阅读操作系统概念(第 9 版),在第 443 页,我发现了有关需求分页以及这如何影响进程时序的有趣考虑。这是它所说的:

假设页面大小为 128 个字。考虑一个 C 程序,其功能是将 128×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。

所以我尝试在我的操作系统上执行此操作,只是为了记录这两种方法之间的时间差异。让我们首先说我正在使用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, Segmentation fault。我很确定这种行为必然会减小页面大小,但我无法解释自己为什么。返回的错误代码是-1073741571,但我不是 Windows 专家,起初我认为错误解析与 Linux 类似(我的读数有点证实)所以我取了 16 个较低有效位,但解析的错误代码是253和它不对应于任何有效的错误代码。

标签: cwindowsmemory-managementpaging

解决方案


推荐阅读