プログラム内蔵方式をとる現在のコンピュータでは、プログラムを主記憶上にロードしてから実行します。
マルチプログラミング環境だと、プログラムが同時に複数実行されるため、主記憶の上にはそれらが全てロードされることになります。
限られた主記憶空間を、効率良く使えるようプログラムに割り当てるのが実記憶管理
の役割です。
主記憶装置はメモリとか、メインメモリと呼ばれるものですね。
固定区画方式
主記憶に固定長の区画(パーティション)を設けて、そこにプログラムを読込む管理方式です。
全体を単一の区画とする単一区画方式と複数の区画に分ける多重区画方式があります。
単一区画は一つのプログラムしかロードできないので、マルチプログラミングには使えません。
一方で、多重区画は区画ごとにプログラムをロードすることができます。
区画のサイズが均等である必要はなく、4MBと8MBと16MBの組み合わせにしたり、色んな分け方が可能です。
記憶管理は単純ですみますが、プログラムを読み込んだ後、区画内に生じたあまりスペースは使用することができず、区画サイズ以上のプログラムを読込むこともできません。
そのため、主記憶の利用効率はあまりよくないです。
可変区画方式
主記憶を最初に固定長で区切ってしまうのではなく、プログラムをロードするタイミングで必要なサイズに区切る管理方式が可変区画方式です。この方式では、プログラムが必要とする大きさで区画を作り、そこにプログラムをロードします。
区画内に余剰スペースは生じないため、固定区画方式よりも主記憶の利用効率は良くなります。
区画に無駄がないので問題がないように見えますが、新たな問題があります。
フラグメンテーションとメモリコンパクション
可変区画方式だと、主記憶上にプログラムを隙間なく詰め込んで実行することができます。
必ずしも詰め込んだ順番にプログラムが終了するとは限りません。
主記憶の空き容量自体がプログラムの実行にたるサイズであったとしても、それを連続した状態で確保することができません。
この現象を フラグメンテーション(断片化) と呼びます。
1MB
----
3MB
----
3MB
フラグメンテーションを解消するために、ロードされているプログラムを再配置することによって、細切れ状態にある空き領域を、連続したひとつの領域にしてやる必要があります。この操作を メモリコンパクションと言います。
1MB
3MB
3MB
(6MBの空き領域)
一つの連続した領域を作り出す。
閑話休題
本の中でメモリコンパクションとガベージコレクションが一緒の括りになってしまっているため、細かく説明しようと思います(本の説明でたまに端折っている部分がある)
-
ガベージコレクション:実行中のプログラムが占有していたメモリ領域のうち不要になったものを自動的に解放し、空き領域として再利用できるようにするもの。ガベージコレクションは「ごみ収集」の意味を持ちます。
-
メモリコンパクション:メモリの断片化を解消することによって、連続した広い空間に再編すること。
ガベージコレクションは従来はプログラマが自分でメモリの解放を行う必要があったのですが、ガベージコレクションが組み込まれているプログラミング言語やフレームワークの場合は、実行中のプログラムの動作から不要になったと判断した領域を自動的に解放します。
メモリの断片化(フラグメンテーション) を解消するために メモリコンパクションを行います。
オーバーレイ方式
どれだけ区画を効率良く配置できるようにしても、そもそも実行したいプログラムのサイズが主記憶の容量を超えていたら、ロードできません。
これを可能にするための工夫がオーバーレイ方式です。
この方式では、プログラムをセグメントという単位に分割しておいて、そのときに必要なセグメントだけを主記憶上にロードして実行します。
プログラムは複数の機能が組み合わさった集合体です。常にその全機能が使われているわけではありません。
そのため、処理の過程で必要とされる機能だけを主記憶上へロードすることにしてやれば、占有する場所を減らすことができます。
スワッピング方式
マルチプログラミング環境では、優先度の高いプログラムによる割込みなどが発生した場合、現在実行中のものをいったん中断させて切り替えを行います。
このような時は、優先度の低いプログラムが使っていた主記憶領域の内容を、いったん補助記憶装置に丸ごと退避させることで空き領域を作ります。
主記憶装置 補助記憶装置
プログラムA プログラムD
プログラムB
プログラムC
上記をスワップアウトという
退避させたプログラムに再びCPUの使用権が与えられるときは、退避させた内容を補助記憶装置から主記憶へとロードし直して、中断箇所から処理を再開します。
主記憶装置 補助記憶装置
プログラムA
プログラムB
プログラムC
プログラムD
上記をスワップインという
スワップアウトとスワップインを合わせた処理のことをスワッピングと呼びます。
スワッピングが発生すると、主記憶の代用として低速な補助記憶装置へのアクセスを行うことになるので、処理速度が極端に低下します。
まとめ
プログラムを書いても裏側ではパソコンが様々な処理を行なっているので、何回も言いますが大事なところですね。