c - 页面大小减小如何影响 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
和它不对应于任何有效的错误代码。
解决方案
推荐阅读
- octobercms - 在 octobercms 中使用 ajaxConfirmMessage 创建自定义确认对话框
- javascript - 在 localhost / 无 node.js 上使用 JavaScript 进行半动态导入或读取文件
- javascript - 如何过滤 API?
- kdb - 将符号作为参数传递给 kdb 中 fby 的函数时出错
- javascript - 在这堂课的最后一个“过去-2”之后,我将如何检查通过了多少堂课?
- javascript - Vue.js 中的 Spotify
- reactjs - 如何模拟 React setState 进行 API 测试
- swift - 如何在新根目录下将文本字段添加到 Firebase?
- visual-c++ - 为什么我的 lp 文件为每个变量提供#number?
- python - 过滤以特定字符串开头的 txt 行 (Python)