在运行一个试图在不同机器上超过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后,该过程会慢一点,这是正常的。
machine3:这台机器只有2GB的内存。甚至无法分配内存。似乎没有设置over commit或者内核2.4不支持使用malloc分配虚拟机页面!因此,在第一个for循环中,它在为i = 2138
分配内存时退出我想要的行动是机器2中发生的行为。有没有人知道必须设置哪个(内核?)选项允许操作系统使用malloc分配虚拟内存页面并在所需内存超过RSS时开始分页?
由于
答案 0 :(得分:5)
您将无法在32位计算机上分配100GB并使用常规指针解决它,这是您的代码似乎使用的。机器1在达到大约4GB并且机器2没有强烈暗示机器2正在运行64位操作系统时终止该过程这一事实。