malloc在不同的机器上performance不同

当运行一个程序,试图在不同的机器上超过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。 因此,OOM杀手杀死过程当i = 3800打印这是大约4GB的本机的内存。

Machine2:内存使用内存过度分配,while循环一直持续,从虚拟内存中分配页面。 打印i = 3800后,这个过程会慢一点,这是正常的。

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

我期望的行动是在machine2发生的。 有谁知道哪些(内核?)选项必须设置为允许操作系统使用malloc分配虚拟内存页面,并开始分页,而所需的内存超过RSS?

谢谢

您将无法在32位计算机上分配100 GB,并使用常规指针寻址,这正是您的代码似乎使用的方式。 机器1在约4GB时结束处理,机器2不强烈表明机器2正在运行64位OS。