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

时间:2010-02-01 20:39:10

标签: 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);
...

上面的代码尝试使用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时开始分页?

由于

1 个答案:

答案 0 :(得分:5)

您将无法在32位计算机上分配100GB并使用常规指针解决它,这是您的代码似乎使用的。机器1在达到大约4GB并且机器2没有强烈暗示机器2正在运行64位操作系统时终止该过程这一事实。