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 のメモリを割り当てようとします。このコードを試した最初の 2 台のマシンは Linux カーネル 2.6 で実行され、最後のマシンは Linux カーネル 2.4 で実行されました。これらのマシンで見られる動作は次のとおりです。

マシン 1: メモリはメモリ オーバーコミットを使用して割り当てられますが、while ループでメモリ位置に値を割り当てる場合、RSS が許可する範囲でしか割り当てられません。したがって、OOM Killer は、i=3800 が出力されるとプロセスを強制終了します。これは、このマシンが持つ約 4GB のメモリです。

マシン 2: メモリ オーバーコミットを使用してメモリが割り当てられ、while ループが無限に続き、仮想メモリからページが割り当てられます。i = 3800 が出力された後、プロセスは少し遅くなりますが、これは正常です。

machine3: このマシンには 2GB のメモリしかありません。メモリを割り当てることさえできません。オーバーコミットが設定されていないか、カーネル 2.4 が malloc! を使用した仮想マシン ページの割り当てをサポートしていないようです。したがって、最初の for ループでは、i = 2138 にメモリを割り当てながら終了します。

私の望むアクションは、machine2 で起こっているアクションです。OSがmallocを使用して仮想メモリページを割り当て、必要なメモリがRSSを超えている間にページングを開始できるようにするには、どの(カーネル?)オプションを設定する必要があるか知っていますか?

ありがとう

4

1 に答える 1

5

32 ビット マシンに 100GB を割り当てて、コードで使用しているように見える通常のポインターを使用してアドレス指定することはできません。マシン 1 が約 4GB に達するとプロセスを終了し、マシン 2 がプロセスを終了するという事実は、マシン 2 が 64 ビット OS を実行していることを強く示唆するものではありません。

于 2010-02-01T20:45:47.350 に答える