|
|
|||||||||||||||||||||
|
簡単にまとめますと,
となっています。要するに,大きなサイズで malloc していると 2GB まで, 細かく malloc してると 1GB までしか使えない,ということです。 それぞれアドレス空間の別の部分を使いますので, どちらも満たしていないといけません。 x86/Linux では下図のようにトータル 4GB のアドレス空間が, 大きく3つの領域に区切られています (どこで区切るかはカーネルコンパイル時に決められています)。
128kB 以下の malloc 時には,一番下の 0 〜 0x40000000 の領域しか 使えないため,128kB 以下での malloc のトータルが 1GB というのが 一つの制限となります。 一方,128kB 以上 (ちょうど128kBもこちら) で malloc した場合は,0x40000000 〜 0xC0000000 の 2GB の空間が 用いられます(0x40000000 の方から使い出す)。 stack もこの空間を使いますので(0xC0000000 側から使い出す), stack サイズと 128kB 以上で malloc したメモリサイズの合計が 2GB までというのがもう一つの制限となります。 実は溢れた場合 heap 領域を使いだしたりするようですが, 非常に遅くなったりして実用上はきびしいようです。 念のため付け加えますと,上記の説明は実メモリとスワップの合計が 十分ある場合です。 上記の制限に達するより先に,システム全体での使用メモリ量が 実メモリとスワップの合計に達してしまうと, 当然こちらの制限によりプロセスが落ちることになります。 |
postmaster@alde.co.jp
までお願いします。 |
|||||||||||||||||||
|
技術情報へ戻る
(C) 2001-2012 Allied Engineering Corporation. All rights reserved. |
|||||||||||||||||||||