Web教材一覧ハードウェアとソフトウェア

仮想記憶方式

キーワード

実記憶、仮想記憶、ページング、スワッピング、スラッシング

過去問題:仮想記憶


仮想記憶

仮想記憶方式の定義・意義

コンピュータすなわちCPUが処理をするためには,必要とするプログラムやデータがメモリに入っている必要があります。ところが,メモリの容量は比較的小さいので,プログラム全体の容量がメモリ(それを実記憶といいます)の容量を超えることもあります。
 大きいプログラムがあったり,同時に多くのプログラムを実行するときには,メモリの容量が足りなくなってしまいます。パソコンで一人で使っている場合でも,ワープロソフト,表計算ソフト,WWWブラウザなどが開いていることもありましょうし,OSやアンチウィルスソフトなどの多くの常駐プログラムが存在しています。
 これを解決するのが仮想記憶方式です。これによって,プログラマは実メモリの容量や他人の利用を考慮することなくプログラムを構築することができますし,コンピュータの共同利用が可能になったのです。

ページング(スワッピング)

ページングの図解

仮想記憶方式では,実行されるプログラムをページという一定の大きさの単位に分解して,仮想記憶(実際にはディスク)に保管します(このページのサイズはコンピュータのアーキテクチャ -CPUやOSの設計- により決まります。現行のコンピュータでは,ほとんどが4KBを採用)。
 そして,実行に必要なページがメモリに存在しない(ページフォルトという)ときは、そのページを仮想記憶から実記憶に取り込みます。これをページインロールイン)といいます。CPUでの処理が進むにつれて,いろいろなプログラム,あるいは一つのプログラムでのいくつものページが実記憶にページインされます。その結果,実記憶が一杯になると(実際にはある制限値を超えると),不要になった実記憶のページを仮想記憶へ移して空きページを作ります。これをページアウトロールアウト)といいます。ページインとページアウトを総称してページングあるいはスワッピングといいます。
 すなわち,仮想記憶方式とは,プログラムをページに分解して仮想記憶に蓄え,ページングによりその時点で必要なページを実記憶に置くことにより,実記憶の容量よりも大きなプログラム群の処理を可能にする方式だといえます。
(注)「ロールイン/ロールアウト」は、後述のセグメント方式で用いられていた用語ですが、現在でも「ページイン/ページアウト」の意味で使うことがあります。

スラッシング

ページングが頻繁に発生すると,CPUはページング作業のために,本来の処理の効率が低下します。利用者からみれば、応答が遅くなり、コンピュータが止まってしまった状況(ホールドしたなどといます)になります。このような現象をスラッシングといいます。
 スラッシングが発生するのは、仮想記憶からページインされる総量に対して、あまりにも実記憶容量が小さいときに発生します。仮想記憶からページインされる総量は、あるプログラムが他ページ(離れている領域)をアクセスするという場合もありますが、多重度が大きく仮想記憶に置かれる量が大きくなっていることが主原因です。それで、ホールドした場合、動作しているアプリケーションを止める(多重度を減らす)と復旧するのはよく経験することです。
 スラッシングが頻発する場合は、常駐プログラムを削除します。さらには、メモリを増強する(実記憶容量を増やす)必要があります。

ページアウトの方式

ページアウトを行うとき、どのページをページアウトするのかが問題になります。代表的な方法を示します。

ポピュラな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│
     └───┴───┴───┘    └───┴───┴───┘

(補)セグメント方式

現在の仮想記憶方式(ベージング方式)が確立する以前に、実記憶容量を超えるプログラムを実行するには、セグメント方式(あるいはオーバーレイ方式ともいう)が行われていました。

プログラムを処理のかたまりより、いくつかのセグメント(ページに相当)に分割します。セグメントAからセグメントBに処理を移すには、プログラム内に「セグメントBをロードする」という命令を入れておくのです。
 Aで使われていたメモリ領域を解放してBを重ねてロードすること(ページングに相当)をオーバーレイといいます。
 適切なセグメント化ができれば、ロールイン/ロールアウトの回数を減らせるので、ベージング方式よりも処理効率がよくなります。しかし、プログラマが実記憶容量や同時に実行されている他のプログラムが使っている容量を把握している必要があります。これは実際には困難なことが多く、ページング方式の普及により、特別なケース以外には使われなくなりました。


メモリ管理

処理に応じてメモリを確保し、不要になったら解放すること、OSが常駐しているメモリ領域を通常のソフトウェアが破壊するのを防ぐことなどをメモリ管理といいます。OSの主要機能の一つです。仮想記憶方式もメモリ管理機能の一部です。
 ここでは、メモリ管理のいくつかを列挙します。

メモリコンパクション

「磁気ディスクの断片化とデフラグ」と同様に、メモリ領域の動的な割当て及び解放を繰り返すことによって,小さな断片が発生します。それをデフラグして、連続する大きな領域にすることをメモリコンパクションといいます。

ガーベジコレクション

メモリコンパクションと似ていますが、異なる概念です。アプリケーションが終了したときに不要となる領域それをガーベジ(garbage、「ゴミ」の意味)領域といいます)をOSやアプリケーションが自動的に回収(削除)する機能です。
 これが常に行われればよいのですが、その機能をもたないアプリケーション(言語)もありますし、アプリケーションが異常終了したときは、ガーベジが解放されずに残ってしまうことがあります。そのときは、意識的にガーベジコレクションのツールを使う必要があります。
 ガーベジコレクションで解放した断片をメモリコンパクションで再編成するというように、一体となって行われることがよくあります。
(データベースの更新・削除処理を続けるとデータベースに不要なデータがたまります。これを整理することもガーベジコレクションといいます。これはメモリ管理とは無関係です。)