仮想メモリとは?
仮想メモリという言葉は今では紛らわしいのですが、2 つの意味があります。
1 つは仮想記憶とも呼ばれる、スワップ等で使われる技術を指します。もう 1 つは仮想サーバ上のメモリのことを指します。
この記事では前者の仮想記憶について話します。後者の仮想サーバ上のメモリの話はしません。
仮想記憶の本質
仮想記憶」に関してですが、「仮想記憶 = スワップ」と勘違いされる方もいますが、本質は違います。
アプリケーションを作成する際に、メモリを意識したプログラミングが必要になりますが、物理メモリのアドレスをアプリケーション開発者が扱うのは極めて困難です。
そこで、アプリケーション開発者が扱いやすいように、物理的にバラバラなアドレスを、連番でのアドレスとして扱えるようにしたのが仮想記憶です。
仮想記憶の概念を使うことで、アプリケーション開発者は欲しい量だけを要求するプログラミングにすればよく、どこから払い出せば良いかは OS 側で対処します。OS は解放された物理アドレスをかき集め、連番の仮想記憶へ振り直し、アプリへ払い出します。
その副次的な拡張機能として、HDD の一部の領域も仮想記憶のアドレスとして考えてしまうスワップが考案、実装されたのです。
仮想記憶のアドレスと物理メモリのアドレスの変換は MMU (Memory Management Unit: メモリ管理ユニット) が行います。MMU は仮想アドレスと物理アドレスをどう変換するかが記載されている"ページングテーブル"を使い変換するのです。このページングテーブルは、刻一刻と変化しますので、随時更新が行われます。
MMU はかつてはメモリコントローラに存在し、CPU とメモリの間に挟まれていましたが、今やメモリコントローラは CPU に内蔵されるようになり、MMU も CPU 内蔵となっています。
仮想記憶では仮想アドレスを物理メモリのアドレスにマッピングしますが、それ以外に、HDD のスワップ領域にマッピングすることもできます。これにより物理メモリ以上に仮想メモリの領域を確保することができるようになります。この仕組みをスワップと言います。
物理メモリが不足し、アクセス頻度の少ないメモリ領域を HDD のスワップ領域へ追い出すことを『スワップアウト』と呼び、逆に、必要となった領域がスワップアウトにより追い出されていたのをまた物理メモリへ戻すことを『スワップイン』と呼びます。
仮想メモリとスワップはなぜ混同される?
Windows ではスワップ領域のことを『仮想メモリ』と表現していることが原因だと思われます。
まとめ
仮想記憶は本来はアプリケーションに対して連番のアドレスを提供する機能、その副次的な拡張機能としてスワップがあり、「仮想記憶のうち、HDD を使う領域=スワップ」なのです。
コメント
「MMU では仮想アドレスを物理メモリのアドレスにマッピングしますが、それ以外に、HDDのスワップ領域にマッピングすることもできます。」
以上の表現は誤解の元となります。
MMU が管理できるのはプロセスが使用する仮想アドレスと物理メモリが使用する物理アドレスの変換までです。
メモリスワッピングは MMU の機能を応用した OS の機能であり、MMU そのものの機能ではありません。
もふもふうさぎさん、コメントありがとうございます。
仮想記憶の機能と MMU の機能を区別していませんでしたが、なるほど確かに。
MMU ⇒ 仮想記憶 に書き直しました。
私自身の理解が深まりました。
ご指摘ありがとうございます。