はじめに
プログラムはメモリにどのようにロードされるのか疑問に思ったのでまとめる。
一括でプログラムがロードされるという印象であったが、セグメント単位でロードされるオーバーレイ方式があると知り、疑問に思った。
調査結果
探していたものが見つかった。
プログラムは必ずしもすべてロードされなくてもよいことが分かった。必要な時に取り出す。
記憶管理について体系的に学ぶことができた。実記憶管理というものは認識していなかったため、勉強になった。
オーバーレイ方式は実記憶管理らしい。仮想記憶管理のページング方式も同じようにオーバーレイ方式になるような気がした。
同じような疑問があった。
オーバレイ方式は容量が大きくて、一度にローディングできないプログラムをセグメントに分割して必要なセグメントだけをロードして実行する方式。
仮想記憶システムはプログラムを分割して、必要な部分だけを主記憶装置にロードする。
オーバレイ方式は実記憶管理らしいのですが、上記のような感じに考えるとオーバレイ方式も仮想記憶管理になるような気がするのですが、何がどう違うのですか?
以下、回答。
仮想記憶の説明が中途半端で確かに紛らわしいですね。
仮想記憶の場合、すでに説明したように、プログラムの分割も必要な部分のメモリーへの
ロードも全てハードとOSがアプリケーションに気づかせる事無く勝手に行ないます。
オーバレイ方式ではこれを全てアプリケーションがやらないといけないのです。
次にオーバレイ方式が仮想記憶管理でない証拠をお見せしましょう。
オーバレイ構造の図を使いましょう。
参考URLがdocファイルなのでここにURLを載せられません。
Googleで「コンピュータシステム入門 オーバレイ構造」で検索してください。
問14にオーバレイ構造図があります。
このプログラムの本当の大きさは(A+B+C+D+E+F+G)です。
しかし、実際に使うメモリーの大きさは(A+B+D+F)のように小さいです。
一方、このプログラムを仮想記憶で動かす時には使う仮想メモリーの大きさは
(A+B+C+D+E+F+G)です。
使われる実記憶はこれよりも少ないはずですが実際にいくら使うかは
アプリケーションはノータッチです。
このようにアプリケーションから見た使用メモリー量と実際に使われるメモリー量の間に
差があるものが仮想記憶管理と言われるのです。
プログラムと仮想アドレス空間の理解を深める
まず、複数のプログラムをOSで実行する際はプロセスごとにそれぞれ異なるアドレス空間が割り当てられる。
「異なるアドレス空間」とは「仮想アドレス空間上で同じアドレスの値でもプロセスが異なれば物理メモリ上では別アドレス」ということ。
このアドレス空間を実際にメモリとして利用したときに、OSが実際の物理メモリを割り当ててくれる。物理メモリ上では連続していなくても、アドレス空間上で連続していれば、それは地続きのメモリとしてプログラム側からは扱うことができる。最近のコンピュータはこんな感じで動く。
このように、メモリ空間そのものではないが、実質的にメモリ空間と同様に扱えるアドレスの仕組みのことを仮想アドレスと呼ぶ。
以下は仮想アドレスの特徴。割り当て単位はページサイズの容量。割り当てと解放は重い処理。
- 仮想アドレスに割り当てられる物理メモリはページと呼ばれる単位になる(多くのシステムでは4KB)
- 物理メモリの割り当てと解放はそれなりに重たい処理なので、頻繁に発生させるのは避けたい
- 物理メモリの断片化はページ単位なら仮想アドレスで吸収できるが、肝心の仮想アドレス空間上での断片化はどしようもないので対策が必要
仮想アドレス空間のサイズはOSの
で決まる。よくわかってなかった。仮想アドレス空間もうまくやらないとプロセスが落ちることがあるそうだ。
通常、仮想アドレス空間は物理メモリより十分な大きさがある(x64なら128TB)ため、多少断片化しても後方のアドレスを使っていけば、物理メモリが空いていれば確保はできます。しかし長時間動作するプログラムでそれを繰り返していくと、128TB分あるアドレス空間でも使い切ることがありえます。物理メモリは足りてそうなのに、同じソフトを長時間使っていると落ちることがあるのはこのためです。
仮想アドレスを利用できる環境においても、メモリ管理はそれなりに賢くやらないとシステムとして安定しません。肝に銘じましょう。
さらなる疑問
パフォーマンスモニタで見ているMemoryは物理メモリの容量なのか??
仮想アドレス空間の状態は見れるのか??