2.4. Cygwin の最大メモリを変更する

デフォルトでは、Cygwin プログラムには 384MB 以上のメモリ(プログラム + データ)を割り当てることは出来ません。 一般的な状況では、この値を変更する必要はないでしょう。 しかし、より多くの実メモリ或いは仮想メモリを必要とする場合は、レジストリの HKEY_LOCAL_MACHINE (全てのユーザの制限を変更する)又は HKEY_CURRENT_USER(現在のユーザの制限だけを変更する)セクションに、あるエントリを追加します。

DWORDheap_chunk_in_mb を追加し、必要となるメモリの上限値を 10 進数表現の MB 単位で設定します。 Cygwin から行うのであれば、Cygwin パッケージに含まれている regtool プログラムを利用するほうがよいでしょう (regtool 及び他の Cygwin ユーティリティに関する更なる情報については 項3.7. 「Cygwin ユーティリティ」 を参照するか、各ユーティリティに --help オプションを付けて実行して下さい)。 システムのレジストリに損傷を与えると、結果としてシステムが使用不能になり得ます。 regtool を利用する場合は常に十分な注意を払って下さい。 この例はメモリの上限を 1024 MB に設定しています。

regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024
regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin

全ての実行中の Cygwin プロセスを終了させ、再度起動して下さい。 メモリはシステムのスワップスペースのサイズから、実行中のプロセスの全合計サイズを引いた量まで割り当てることが出来ます。 システムスワップは少なくとも物理メモリよりは大きくなければなりません。 スワップ量はコントロールパネルの「システム」を利用して変更することが出来ます。

これは DJ Delorie による簡単なプログラムで、 システムのメモリ割り当ての上限値をテストします。

main()
{
  unsigned int bit=0x40000000, sum=0;
  char *x;

  while (bit > 4096)
  {
    x = malloc(bit);
    if (x)
    sum += bit;
    bit >>= 1;
  }
  printf("%08x bytes (%.1fMb)\n", sum, sum/1024.0/1024.0);
  return 0;
}

このプログラムは次のようにしてコンパイル出来ます。

gcc max_memory.c -o max_memory.exe

プログラムを実行すると、割り当て可能なメモリの最大量が出力されます。