Pir*_*ooz 5 c linux malloc paging virtual-memory
在运行一个试图在不同机器上超过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);
...
Run Code Online (Sandbox Code Playgroud)
上面的代码尝试使用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时开始分页?
谢谢