「仮想メモリー」をご存じですか? ハードディスクの一部をメモリーとして使うことで,メモリー(物理メモリー)の不足を補う仕組みです。

 仮想メモリーの仕組みは,OSが提供してくれます。したがって,私たちがプログラムを作るときには,仮想メモリーを意識したコードを記述する必要はほとんどありません。もしも,メモリーが足りなくなったら,Windowsがメモリーの一部をハードディスクに移して,メモリー空間を空けてくれるからです。

 Windowsさんありがとう! などとお礼を言って終わりでは,ちょっともの足りない気がします。仮想メモリーが実際にどんなものか,一度は見ておきたいですね。今回は,仮想メモリーに関する実験をやってみましょう。

最初にちょっとだけお勉強

 実験を行う前に,仮想メモリーの勉強をしておきましょう。仮想メモリーには,大きく分けて二つの方式があります。「セグメント方式」と「ページング方式」です。

 メモリーが不足したときには,メモリー(物理メモリー)上のプログラム全体がまるごとハードディスク(仮想メモリー)に移されるわけではありません。プログラムをいくつかの部分に分割して,部分ごとに移します。プログラムを,処理やデータに都合のよい区切りで分割するのが「セグメント方式」で,内容にかかわらず固定サイズで分割するのが「ページング方式」です。

 セグメント方式は,効率が良いのですが,仕組みは複雑になります。逆に,ページング方式は,効率は悪いのですが,仕組みは単純になります。それぞれに一長一短があり,どちらがよいとは一概には言い切れません。

 Windowsは,ページング方式を採用しています。一つのページのサイズは,4Kバイトです。ここでは,Windowsが採用しているページング方式を見ていきます。

 実験の前に,仮想メモリーに関する専門用語を覚えておきましょう。プログラムを固定サイズで分割した部分を「ページ」と呼びます。メモリーとハードディスクの間でページを入れ替えることを「ページング」または「スワップ(swap)」と呼びます。メモリーからハードディスクにページを移すことを「ページアウト」または「スワップアウト」と呼びます。ハードディスクからメモリーにページを戻すことを「ページイン」または「スワップイン」と呼びます(図1)。

図1●ページング方式の仮想メモリーの仕組み
図1●ページング方式の仮想メモリーの仕組み

 実行しようとしたページがメモリー上にないときは,現在使われていないページをページアウトして,必要なページをページインすることになります。OSがこの処理をしている間は,プログラムの実行がいったん中断されます。

 実行しようとしたページがメモリー上にないことを「ページフォルト」と呼びます。ページフォルトが起きると,ページングのための割り込み処理プログラムが起動するので,アプリケーション・プログラムの動作が一時停止します。頻繁にページフォルトが起きると,アプリケーション・プログラムが円滑に動作しない状態になります。これを「スラッシング(Thrashing)」と呼びます。

 皆さんにもきっと経験があると思います。ハードディスクのアクセス・ランプが激しく点滅し,プログラムの応答が遅くなることがあります。その場合,たいてい,スラッシングが起きています。あまりにもスラッシングが頻繁に起きるようなら,お財布と相談して,メモリー容量を増やすことを検討しなければなりません。

仮想メモリーの実体は「pagefile.sys」というファイル

 お勉強が済んだところで,最初の実験です。仮想メモリーの実体を見てみましょう。Windows(ここでは,Windows XPを使います)の仮想メモリーの実体は,ハードディスクのルートディレクトリにあるpagefile.sysというファイルです。これを「ページング・ファイル」と呼びます。

 ページアウトされた個々のページが,一つのページング・ファイルの中に収まっているのです。ページング・ファイルを複数のディスクに分割して,アクセス効率を向上させることもできますが,一般には一つのファイルとなっています。

 エクスプローラを起動して,pagefile.sysを見てみましょう。Windowsは,デフォルトでpagefile.sysのようなシステムファイル(OSの動作に関する重要なファイル)を隠しファイルとしているので,そのままでは画面にファイル名が表示されません。あやまって削除されると困るからです。

 ただし,見るだけなら何も問題ありません。エクスプローラの「ツール」メニューから「フォルダオプション」を選択し,表示されるウィンドウの「表示」タブのリストにある「すべてのファイルとフォルダを表示する」をオンにして[OK]ボタンをクリックしてください。なお,実験が終わったら,「隠しファイルおよび隠しフォルダを表示しない」に戻しておくことをお勧めします(図2)。

図2●「すべてのファイルとフォルダを表示する」をオンにする
図2●「すべてのファイルとフォルダを表示する」をオンにする

 エクスプローラで,ハードディスク(ここでは,Cドライブ)のルートディレクトリを見てください。今まで表示されなかったファイルが,いくつか表示されているはずです。その中に仮想メモリーの実体であるページング・ファイルpagefile.sysがあるはすです。筆者のマシンでは,ファイルのサイズが1,572,864Kバイト(約1.5Gバイト)になっていました(図3)。

図3●ページング・ファイルが仮想メモリーの実体だ
図3●ページング・ファイルが仮想メモリーの実体だ
[画像のクリックで拡大表示]