5

在不同机器上运行试图超过 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 Killer 会在打印 i=3800 时终止进程,这大约是这台机器的 4GB 内存。

Machine2:使用内存过量分配分配内存,while 循环永远持续下去,从虚拟内存中分配页面。打印 i = 3800 后,该过程会变慢一些,这是正常的。

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

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

谢谢

4

1 回答 1

5

您将无法在 32 位机器上分配 100GB 并使用常规指针对其进行寻址,而这正是您的代码所使用的。机器 1 在达到大约 4GB 时终止进程并且机器 2 并不能强烈表明机器 2 正在运行 64 位操作系统。

于 2010-02-01T20:45:47.350 回答