プロセスとメモリ

本ページではOSプロセスとメモリの関係について概要を記載します。

仮想アドレス空間

プロセスが使用するメモリは物理メモリから割り当てられ、物理メモリが足りなくなるとスワップイン、スワップアウトが発生しDISKへの書き出しが発生するという仕組みは有名です。 このことから以下のようなイメージを持っている人が多いのではないかと思います。
memory_1
仮想アドレス空間を考慮しないイメージ図

しかしながら、実際にはプロセス自体が物理メモリを直接参照しているわけではなく以下のように仮想アドレス空間という仕組みを通して物理メモリにアクセスされることを認識することは非常に重要です。
memory_2
32bit OSのプロセスで仮想アドレス空間を考慮したイメージ

①・・・
・同一OS内のすべてのプロセスは同一サイズの仮想アドレス空間を持ちます。 32bit OSでは0x00000000から0xFFFFFFFFまで(2^32=4GB)の空間を持っていますが、64bit OSは4GBよりも桁違いに広い空間を持っています。 なお、「0x」は16進数であることを示す表記です。

・プロセスがメモリを使用すると宣言すると仮想アドレス空間の中に領域が確保されます。よって、1つのプロセスが仮想空間より大きいサイズのメモリを使用することはAWE等の特殊な仕組みを使用しなければできません。 それに加え、仮想アドレス空間はユーザ空間(ユーザ用の領域)とカーネル空間(OS用の領域)が明確に区別されておりユーザプログラムが利用することができるのはユーザ用の領域だけです。 カーネル空間のサイズはOSによって決まっており、通常(※)32bit Windowsにおいては2GB、32bit Linux においては約1GBです。

※・・・Windowsでは4GTという設定を行うことでカーネル空間を2GBから1GBに縮小する、LinuxではHugeMemカーネルを使用することで ユーザ空間とカーネル空間をそれぞれ4GB使用できるようにするといった変更が可能。

②・・・
・異なるプロセスであっても共通で使用しているライブラリ等がロードされる領域等は物理メモリを共有する場合があり、 この仕組みによって同じプログラムを複数プロセスで起動した場合メモリ使用量が節約されます。

③・・・
・プロセスがメモリを使用すると宣言しても全くアクセスされていない領域は物理メモリにもスワップにも割り当てられていません。 ただし、プログラム言語や使用する関数によってはメモリを確保すると同時に内部で割り当てたメモリ領域を初期化するものもあります。
★ORACLE案件承ります