4.3. 基本的な仮想メモリの概念

現代の各種ストレージテクノロジーの構造の背景にあるテクノロジーには目を見張るものがありますが、普通のシステム管理者である場合は詳細まで知っておく必要はありません。実際、システム管理者が常に注意すべきことはひとつだけです。

RAM が十分であることはまずありません。

あまりにもわかりきったことかもしれませんが、多くのオペレーティングシステムの設計者がこの事実から受ける影響を緩和しようと日夜努力を続けています。仮想メモリの実装がそれです。RAM と遅いストレージを結合して実際にインストールしているものより大きい RAM があるように見せる方法です。

4.3.1. 仮想メモリの簡単な説明

仮説のアプリケーションで説明してみます。このアプリケーションを構成するマシンコードは 10000 バイトのサイズだとします。また、データ保存及び I/O バッファにさらに 5000 バイトが必要です。つまり、このアプリケーションを実行するには 15000 バイトの RAM がなければなりません。1 バイト足りなくてもアプリケーションは実行できないでしょう。

ここで必要とされている 15000 バイトはアプリケーションのアドレススペースと呼ばれています。アプリケーションとそのデータの両方を保持するのに必要な固有アドレスの数です。先のコンピュータでは、使用可能な RAM が実行される最大アプリケーションのアドレススペースより大きくなければなりませんでした。さもないと、そのアプリケーションは"メモリ不足"エラーで機能しません。

次にオーバーレイと呼ばれる方法では、どの部分のアプリケーションが特定の時間にメモリ常駐型にならなければならないかをプログラマが指示できるようにすることで、この問題が軽減されるようにしました。 この方法では、初期化の目的で1度だけ必要とされるコードは、あとで使用されるコードで上書き(オーバーレイ)できました。オーバーレイはメモリの不足を緩和しましたが、非常に複雑でエラーが起こりやすいプロセスでした。また、オーバーレイは起動時におけるシステム全体のメモリ不足の問題には対処できませんでした。つまり、オーバーレイされたプログラムはオーバーレイされていないプログラムに比べて実行に必要なメモリが少なくてすむ可能性がありますが、システムにオーバーレイされたプログラムに対して十分なメモリがなければ、結果は同じになります — メモリの不足エラー。

仮想メモリでは、アプリケーションのアドレススペースの概念を頭から変えています。アプリケーションを実行するのに最大必要なメモリではなく、仮想メモリのオペレーティングシステムは"アプリケーションを実行するのに最低必要なメモリはどのくらいか"を継続して求めようとします。

先の仮定ではアプリケーションが実行するのに 15000 バイトを要しました。項4.1での解説を振り返ってみます。メモリアクセスは連続的に局所化する傾向があります。従って、特定の時間にアプリケーションを実行するのに必要なメモリの量は 15000 バイトより少なくなります — 通常はかなり少なくてすみます。単一のマシン命令を実行するのに必要とされるメモリアクセスの種類を考えてみます。

各メモリアクセスに必要な実際のバイト数は CPU のアーキテクチャ、実際の命令、データの種類により異なります。しかし、ある命令がそれぞれのメモリアクセスに 100 バイト毎のメモリを必要としたならば、要求される 300 バイトはアプリケーションのアドレススペース全体の 15000 バイトよりまだ小さいものとなります。アプリケーションが実行するときにそのアプリケーションが要するメモリを追跡する方法が見つかれば、アプリケーションのアドレススペースが指示するより少ないメモリを使用しながらそのアプリケーションを実行し続けることができることになります。

ただし、疑問が残ります。

特定の時間にメモリ内にあるのがアプリケーションの一部だけである場合、残りの部分はどこにあるのでしょうか?

4.3.2. バッキングストア — 仮想メモリの中心となる原理

簡単に説明すると、アプリケーションの残りの部分はディスクに残されたままです。つまり、ディスクは RAM のバッキングストアとして動作します。遅く大きなストレージ媒体が高速で小さなストレージ媒体の"バックアップ"として動作します。ディスクドライブが結局は RAM よりかなり遅いため、一見、非常に大きなパフォーマンス問題になるように見えるかもしれません。

たしかにその通りですが、連続的にそして局所化して起るアプリケーションのアクセス動作を役立たせ、ディスクドライブを RAM のバッキングストアとして使うことによるパフォーマンス関連のほとんどは解消することができます。仮想メモリサブシステムを構築することにより、現在必要とされている — または、近いうちに必要とされる可能性がある — アプリケーションの部分が実際に必要とされている間だけ RAM に保存されるようにします。

多くの点でキャッシュと RAM の関係に似ています。小さい容量の高速記憶装置を大きい容量の低速記憶装置と組み合わせて、大きい容量の高速記憶装置のように動作させます。

この点に注意しながらさらに詳細にプロセスを見てみます。