実記憶、仮想記憶、ページフォルト、ページング、ページイン、ページアウト、スワッピング、スラッシング、スワップ・プリフェッチ方式、FIFO方式、LRU方式、NFU方式、MMU、DAT、デマンドページング、プレページング、オーバーレイ、セグメント方式、メモリ管理、メモリコンパクション、ガーベジコレクション
コンピュータすなわちCPUが処理をするためには,必要とするプログラムやデータがメモリに入っている必要があります。ところが,メモリの容量は比較的小さいので,プログラム全体の容量がメモリ(それを実記憶といいます)の容量を超えることもあります。
大きいプログラムがあったり,同時に多くのプログラムを実行するときには,メモリの容量が足りなくなってしまいます。パソコンで一人で使っている場合でも,ワープロソフト,表計算ソフト,WWWブラウザなどが開いていることもありましょうし,OSやアンチウィルスソフトなどの多くの常駐プログラムが存在しています。
これを解決するのが仮想記憶方式です。これによって,プログラマは実メモリの容量や他人の利用を考慮することなくプログラムを構築することができますし,コンピュータの共同利用が可能になったのです。
仮想記憶方式では,実行されるプログラムをページという一定の大きさの単位に分解して,仮想記憶(実際にはディスク)に保管します(このページのサイズはコンピュータのアーキテクチャ -CPUやOSの設計- により決まります。現行のコンピュータでは,ほとんどが4KBを採用)。
そして,実行に必要なページがメモリに存在しない(ページフォルトという)ときは、そのページを仮想記憶から実記憶に取り込みます。これをページイン(スワップイン、ロールイン)といいます。CPUでの処理が進むにつれて,いろいろなプログラム,あるいは一つのプログラムでのいくつものページが実記憶にページインされます。その結果,実記憶が一杯になると(実際にはある制限値を超えると),不要になった実記憶のページを仮想記憶へ移して空きページを作ります。これをページアウト(スワップアウト、ロールアウト)といいます。ページインとページアウトを総称してページングあるいはスワッピングといいます。
すなわち,仮想記憶方式とは,プログラムをページに分解して仮想記憶に蓄え,ページングによりその時点で必要なページを実記憶に置くことにより,実記憶の容量よりも大きなプログラム群の処理を可能にする方式だといえます。
(注)「ロールイン/ロールアウト」は、後述のセグメント方式で用いられていた用語ですが、現在でも「ページイン/ページアウト」の意味で使うことがあります。
(注)ここで取り扱っているページング方式を、要求によりページインするという意味でデマンドページング方式といいます。これに対して、キャッシングのように近い将来参照されると予測したページもページインすることによりページング回数を減らす方式をプリページング方式あるいはスワップ・プリフェッチ方式といいます。
ページングが頻繁に発生すると,CPUはページング作業のために,本来の処理の効率が低下します。利用者からみれば、応答が遅くなり、コンピュータが止まってしまった状況(ホールドしたなどといます)になります。このような現象をスラッシングといいます。
スラッシングが発生するのは、仮想記憶からページインされる総量に対して、あまりにも実記憶容量が小さいときに発生します。仮想記憶からページインされる総量は、あるプログラムが他ページ(離れている領域)をアクセスするという場合もありますが、多重度が大きく仮想記憶に置かれる量が大きくなっていることが主原因です。それで、ホールドした場合、動作しているアプリケーションを止める(多重度を減らす)と復旧するのはよく経験することです。
スラッシングが頻発する場合は、常駐プログラムを削除します。さらには、メモリを増強する(実記憶容量を増やす)必要があります。
動的アドレス変換は、仮想記憶システムにおいて、仮想アドレスから実アドレスへの変換を行うことです。動的アドレス変換メモリ管理ユニット (MMU) というハードウェア装置によって実装されます。 MMUはCPUに内蔵されたモジュールの場合もあるし、外付けでCPUに密結合された別のチップの場合もある。これを動的アドレス変換機構 (Dynamic Address Translation、DAT) といいます。
ページアウトを行うとき、どのページをページアウトするのかが問題になります。主記憶装置上にないページをページインするために,あらかじめ主記憶装置に空き領域を作るための主記憶装置上のページをページアウトする処理をページリプレースメントといいます。その代表的な方法を示します。
ポピュラなFIFOとLRUを例題を用いて説明します。実記憶のページ枠が3つで、ページがA→B→C→A→D→A→Eの順序で必要になったとします。
FIFO LRU
A A─┐ A─┐
┌┴──┬───┬───┐ ┌┴──┬───┬───┐
│A 1│ │ │ │A 1│ │ │
└───┴───┴───┘ └───┴───┴───┘
B B─┐ B─┐
┌───┬┴──┬───┐ ┌───┬┴──┬───┐
│A 2│B 1│ │ │A 2│B 1│ │
└───┴───┴───┘ └───┴───┴───┘
C C─┐ C─┐
┌───┬───┬┴──┐ ┌───┬───┬┴──┐
│A 3│B 2│C 1│ │A 3│B 2│C 1│
└───┴───┴───┘ └───┴───┴───┘
A 存在するのでページアウト不要 A─┐参照された
┌───┬───┬───┐ ┌──┴┬───┬───┐
│A 4│B 3│C 2│ │A 1│B 3│C 2│
└───┴───┴───┘ └───┴───┴───┘
D D─┐ ┌─A D─┐ ┌─B
┌┴─┴┬───┬───┐ ┌───┬┴─┴┬───┐
│D 1│B 4│C 3│ │A 2│D 1│C 3│
└───┴───┴───┘ └───┴───┴───┘
A A─┐ ┌─B A─┐参照された
┌───┬┴─┴┬───┐ ┌──┴┬───┬───┐
│D 2│A 1│C 4│ │A 1│D 2│C 4│
└───┴───┴───┘ └───┴───┴───┘
E E─┐ ┌─C E─┐ ┌─C
┌───┬───┬┴─┴┐ ┌───┬───┬┴─┴┐
│D 3│A 2│E 1│ │A 2│D 3│E 1│
└───┴───┴───┘ └───┴───┴───┘
デマンドページングとは、アクセス要求があったときに、要求があったページのみを主記憶にロードする方式で、通常のページング方式です。上述の説明はデマンドページングの説明です。
プレページングとは、アクセス要求があったときに、要求があったページだけでなく、参照されそうな他のページも前もって主記憶にロードする方式です。主記憶とCPUの間でのキャッシュと似た考え方です。ページング回数を減らす効果がありますが、主記憶の容量を圧迫する欠点があります。
仮想記憶方式がなかった時代、実記憶よりも大きなプログラムを実行するには、オーバーレイという方法がありました。プログラムを作成する段階で、全体のプログラムを同時に実行することがない部分をセグメントという単位に分割しておき、他のセグメントに移るときに、不要なセグメントを実記憶から削除し、必要なセグメントをプログラムが存在するディスクから実記憶にロードする命令を組み込んでおくのです。この方法は、複数のプログラムによる実記憶不足には対応できません。
単純にいえば、オーバーレイでのセグメントのロールイン/ロールアウトをOSが自動的に行う方式です。
セグメントは実記憶上に連続した領域として割り当てられます。セグメントの大きさが可変長なため、場合によっては、実記憶上には空き領域の合計が十分あるのに連続領域が空いていないことがあります(フラグメンテーション)。
現在、この方式は特殊な場合を除き、用いられていません。
処理に応じてメモリを確保し、不要になったら解放すること、OSが常駐しているメモリ領域を通常のソフトウェアが破壊するのを防ぐことなどをメモリ管理といいます。OSの主要機能の一つです。仮想記憶方式もメモリ管理機能の一部です。
ここでは、メモリ管理のいくつかを列挙します。
「磁気ディスクの断片化とデフラグ」と同様に、メモリ領域の動的な割当て及び解放を繰り返すことによって,小さな断片が発生します。それをデフラグして、連続する大きな領域にすることをメモリコンパクションといいます。
メモリコンパクションと似ていますが、異なる概念です。アプリケーションが終了したときに不要となる領域それをガーベジ(garbage、「ゴミ」の意味)領域といいます)をOSやアプリケーションが自動的に回収(削除)する機能です。
これが常に行われればよいのですが、その機能をもたないアプリケーション(言語)もありますし、アプリケーションが異常終了したときは、ガーベジが解放されずに残ってしまうことがあります。そのときは、意識的にガーベジコレクションのツールを使う必要があります。
ガーベジコレクションで解放した断片をメモリコンパクションで再編成するというように、一体となって行われることがよくあります。
(データベースの更新・削除処理を続けるとデータベースに不要なデータがたまります。これを整理することもガーベジコレクションといいます。これはメモリ管理とは無関係です。)