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

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时开始分页?

谢谢

Tim*_*sch 5

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