アライドエンジニアリング
技術情報
Linux(x86)で使えるメモリサイズについての説明です。
Linux(x86)で使えるメモリサイズ
x86 (386, 486, Pentium ...) の Linux では,最新のカーネルを使えば 64GB まで使える,などと聞かれたことがあるかも知れませんが,これはシステム全体として使えるメモリサイズで,1 プロセスではこんなに使えません。まず,32bit のアーキテクチャということで 4GB (2^32B) の壁があるのですが,実は更に制限があります。

簡単にまとめますと,

  • 1回の malloc のサイズが 128kB 以下のものの合計: 約 1GB まで
  • 1回の malloc のサイズが 128kB 以上のものの合計: 約 2GB まで

となっています。要するに,大きなサイズで 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.