gpt4 book ai didi

c - malloc 在不同的机器上表现不同

转载 作者:IT王子 更新时间:2023-10-29 00:31:22 27 4
gpt4 key购买 nike

在不同的机器上运行一段试图超过 RSS 的程序时,我看到了完全不同的行为。代码是这样的:

...
char** s = (char**)malloc(10000*sizeof(char*));

for (i = 0; i < 10000; i++){
s[i] = (char*)malloc(1000*1000*sizeof(char));
if (s[i] == NULL) {
printf("cannot allocate memory for s[%d]",i);
exit(1);
}
}

int j = 0;
while(1){
for (i = 0; i < 10000; i++){
for (j = 0; j < 1000*1000; j++) {
s[i][j] = 1;
}
if ((i % 100) == 0) printf("i = %d\n", i);
}
}
for (i = 0; i < 10000; i++)
free(s[i]);
free(s);
...

上面的代码尝试使用 malloc 分配大约 10GB 的内存。我试过这段代码的前两台机器在 linux 内核 2.6 上运行,最后一台机器运行 linux 内核 2.4。以下是我在这些机器上看到的行为:

Machine1:内存是使用内存过量分配分配的,但是在 while 循环中为内存位置赋值时,它只分配 RSS 允许的数量。因此,当打印出 i=3800 时 OOM Killer 会终止进程,这意味着这台机器有大约 4GB 的内存。

Machine2:使用内存过量分配分配内存,while 循环永远持续下去,从虚拟内存分配页面。打印 i = 3800 后,过程会稍微慢一些,这是正常的。

机器 3:这台机器只有 2GB 内存。甚至无法分配内存。似乎未设置过度提交或内核 2.4 不支持使用 malloc 分配虚拟机页面!因此,在第一个 for 循环中,它在为 i = 2138 分配内存时退出

我想要的 Action 是 machine2 中发生的 Action 。有谁知道必须设置哪些(内核?)选项以允许操作系统使用 malloc 分配虚拟内存页面并在所需内存超过 RSS 时开始分页?

谢谢

最佳答案

您将无法在 32 位计算机上分配 100GB 并使用常规指针对其进行寻址,这正是您的代码似乎使用的。机器 1 在达到大约 4GB 时终止进程,而机器 2 并不能强烈表明机器 2 正在运行 64 位操作系统。

关于c - malloc 在不同的机器上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com