仮想メモリについて

 どこかのパクリ

仮想メモリ(Virtual Memory)

仮想メモリとはハードディスクなどの一部を、あたかも物理メモリの一部であるかのようにして提供される仮想的なメモリ領域のことです。アプリケーションから見ると、単に大量の利用可能なメモリ領域が存在するように見えます。これによりコンピュータに実際に搭載されている物理メモリを大幅に超えたメモリを消費するアプリケーションを実行したり、大量のメモリを消費するアプリケーションを複数同時実行したりできるようになります。
仮想メモリが登場した背景には、アクセス速度は非常に高速だが昔は非常に高価で大量に実装することが困難な物理メモリと、アクセス速度は低速だが、大量の領域を確保できるハードディスクの一部の領域をひとまとめにし、物理メモリサイズを大幅に超える仮想メモリ空間を実現するためにできました。(今では考えられないかもしれませんが昔は1MBが数万円という時代もありました。)

コンピュータで実行されるプログラムには局所性があり、ある瞬間をみるとプログラム全体の一部分だけがメモリ上に存在していれば動作します。このような特徴をうまく使って、アプリケーションに割り当てるメモリ空間(論理メモリ空間)の一部だけに物理メモリを割り当てるようにし、物理メモリサイズを大幅に超える論理メモリ空間を作り出したり、複数の論理メモリ空間をアプリケーションに割り当てたりします。

メモリ管理として、当面使いそうもないプログラムやデータを必要になるまでメモリにロードしません。また空き物理メモリがなくなってしまったら、すでにメモリ上にロードされているプログラムやデータから、アクセス頻度の低いものを選び出しこれをハードディスク上に用意したファイルに一時的に待避して、それらが占有していた物理メモリ領域を解放しこのことをスワップアウトと言います。こうして一時待避したデータが再度必要になった場合には、逆にディスクからメモリにロードしなおします。(このとき必要なら、別のメモリ領域をディスクに一時待避します)このことをスワップインと言います。メモリの内容を一時待避するディスク領域は「スワップファイル」と呼ばれます。

スラッシングという物理メモリとスワップ領域の間のやり取りが頻繁に生じる事によるパフォーマ ンスの低下という現象があります。ひどいときにはPCがフリーズしたようになります。ハードディスクへのアクセスは物理メモリへのアクセスと比較して1000倍以上も遅いので、メモリが十分に用意されているマシンでは物理メモリにまだ余裕があるのに仮想メモリを使ってしまうことがありますので、その分余計なスラッシングが生じ却ってパフォーマンスの低下につながることがあります。物理メモリが十分ある場合はあまり大きく仮想メモリ(ページングファイル)のサイズを設定するのは良いとは言えません。ただこれはWindowsで言えば新しいOSになればなるほどメモリ管理は賢くなってきていますので起きることはとても少なくなっています。(仮想キャッシュやファイルマッピングと言うような技術なども含めてメモリ管理のアルゴリズム自体も改善されていってます。)

仮想メモリを実現しているメモリ管理方式にデマンド・ページング方式とセグメント方式という2つのものがあります。Windows、Linux、FreeBSDやMacOS XなどのBSD系やSystemV系などの商用Unix系のOSつまり最近のOSで採用されているのはデマンド・ページング方式です。一方セグメント方式を採用しているのはMacOS9までのMacです。Windowsも3.xまではセグメント方式を採用していました。(仮想メモリを実現するためにはOSだけでは不可能でCPUなどのハードウエアの協力も必要になることと、実は両方合わせたセグメントページング方式なるものがあるのですが、ハードウエアも含めてややこしくなるので省略します。)

デマンド・ページング方式の特徴はプログラムやデータの中身に関係なく小さな一定サイズ(固定長)に分割して管理されています。小さなサイズで固定長にて管理されているため順番に間を詰めてデータなどを配置できるのでメモリの使用効率が良く、複数のプログラムを同時に動かすマルチタスクに向いています。欠点としては固定長で管理されているのでページ内に無駄なものも含まれ、例えば1KBで良いのに4KBの固定長ならば残りの3KB分は無駄になります。また小さいプログラムを呼ぶのにもページごとに行なうので、置き換え回数が多くなりがちになります。

セグメント方式の特徴はプログラムやデータ単位のある程度の意味があるまとまり(可変長)のセグメント(部分)ごとに管理されています。意味のあるまとまりですのでセグメント内には無駄なものが含まれていない上、必要なものだけを保持するので置き換え頻度は下がります。欠点としては仮想メモリにおける物理メモリに対しての管理(アドレス管理)が複雑になることと、物理メモリに対して無駄が増えます。例えば10KBのセグメントの後ろに20KBしか空きがない場合、次に50KBのセグメントを置きたい場合当然無理ですので50KBのセグメントが置けそうなところを探してそこにおきます。10KBの後ろに空いている20KBの空きは20KB以下のセグメントが来るまで空きっぱなしになるということです。セグメント内に無駄なものがなく必要なものだけを保持するので置き換え頻度は下がるのでシングルタスクでは良いのですが、複数のタスクが動くマルチタスクではメモリの管理があまりにも煩雑になりますので向いていません。

MacOS9までメモリの割り当てという作業があったのはプログラムが使用したいメモリ量つまり意味のあるセグメントをOSに対して教えておく(予約しておく)という感じです。MacOS9までの仮想メモリを切るとパフォーマンスが上がるというのは上記のセグメント方式の説明でわかった方も居られると思いますが、仮想メモリの管理が煩雑なのでそれだけ遅くなるということです。例えばイメージとしてセグメント方式とデマンド・ページング方式を比較すると前者は普通の100ピースパズルを組み立てるのと、後者は形が綺麗に揃っている真四角の150ピースのパズルを組み立てると言う感じで、どちらが早いかという感じです。当然普通のパズルは形を合わせていかないといけませんのでそれだけ時間がかかるということです。

仮想メモリをオフにしても実際にはOSが提供しているメモリ空間自体が仮想メモリですのでその構成が物理メモリだけなのか物理メモリ+ハードディスクなのかはアプリケーションから見れば論理メモリ空間として違いがありませんのでメモリ管理自体は旧MacOSならセグメント方式になります。しかしOSから見るとスワップファイルを利用した仮想メモリは論理メモリ空間を形成している物理メモリとスワップファイルとを結ぶ手続きを行わなくていけませんので、旧MacOSでは仮想メモリを使用しない(スワップファイルを使わない)ようにすると、その煩雑な手続きから開放されるのでパフォーマンスがよくなるのは上記の通りです。AdobeのPhotoshopなどは旧MacOSが提供する仮想メモリの効率の悪さに嫌気が差してか自前で仮想メモリを実現していたのでPhotoshopを使用するときは仮想メモリオフにするのはこのためでした。(メモリ関連の話題でこれとややこしい話ですが別にメモリモデルでフラットとセグメントというのがありますがあまり関係ないと思いますので割愛します。)

Windowsにおける仮想メモリはデマンド・ページング方式を採用していますので中身を考慮しない決まった大きさで管理しており仮想メモリを管理することの煩雑さはなくこれによるパフォーマンスダウンはありません。ただ中身を何も考慮していないというのが時として問題になることがあります。上記で書いたように新しいWindowsになればなるほど起こることは少なくなってきていますが、物理メモリが十分にある場合でも仮想メモリのエリア(ページングファイル)に追いやることがあります。これだけでは問題ないような感じがしますが、追いやられた小さな一定
サイズの中に必要なものが一部分入っていることがあります。これ必要なのでくださいと読み込んで、でも大部分はもういらないでしょうとまた戻したりここで小規模なスラッシングが起こることがあります。(流石にOSの独断でアプリケーションからすればここは勝手にスワップアウトしては困ると言うのがありますのでスワップアウトを禁止するメモリ確保をする方法があります。当然それだけ大きな物理メモリを要求しますのでProToolsなど最低512MB以上推奨1GBですので結構それを使っていそうですね。DSPベースですので違う理由かもしれませんが。)

しかしこれは全体から見ればこのような小規模なスラッシングでは実用問題になるようなパフォーマンスダウンはしませんので無視できると言っても良い範囲です。(長時間使っていると微妙にレスポンスが変わることはあるのですが、逆に言うとそれだけです)、それより遥かに問題になるのはページングファイルの断片化です。
ページングファイルが断片化していると明らかにパフォーマンスダウンします。ページングファイルは仮想メモリとして、Windowsの起動時にロックされるのでそのまま標準でWindowsに付属しているデフラグを実行しても効果がありません。Cドライブのみでしたら出来ませんが、一時的に別ドライブにページファイルを移してからデフラグ掛けないといけません。これが面倒ならば市販されているデフラグツールはページングファイルもデフラグ可能ですので検討してみるのも良いかもしれません。

O&O Defrag
http://canon-sol.jp/product/df/
PerfectDisk
http://www.netjapan.co.jp/P_raxco/pd/

あたりが良いようです。断片化する原因は足りなくなったときに拡張を許可していることでこれを許可しないように設定すれば大丈夫です。デフォルトでは初期サイズが物理メモリの150%、最大値が250%になっていてそのまま使用していると既に断片化していることがありますので、そのときはまずページファイルを別ドライブ(別パーティション)へ設定し元のドライブのページングファイルを0にしてデフラグを実施、その後元のドライブに設定し直してその時ページファイルの最小(初期)サイズと最大サイズを同じにするという手順になります。

ページングファイルの置き場で理想的なのはATAならばシステムと別チャンネルの別ドライブに置くのが一番良いと思います。SATA、SCSI構成ならば別のドライブで良いと思います。ATAで同一チャンネルのマスター、スレーブ構成の場合はマスター接続のハードディスクにページング専用で2GBぐらいのパーティションを切ってそこにページングファイルを置くのが良いと思います。あまり居られないと思いますがもしフルSCSIで4台構成と言う場合などは例えば合計1GBのページングファイルを設定する場合250MBずつ4台に分けて設定するのが良いと思います。これはサーバーOSでのチューニング手法ですが。

仮想メモリの設定値ですがこれは多くてもMicrosoft推奨の物理メモリ容量の1.5倍(150%)以内に留めておいた方が良いと思います。よくわからないときはデフォルトの1.5倍(150%)推奨のままで良いと思います。ただし最小値(初期サイズ)と最大値は同じ値にしてください。推奨は推奨と言うように意味があります。

メモリもディスクと同じく使用しているとメモリ領域が断片化していきます。これはアプリケーション起動時にメモリを確保する大きさや場所が変わってくるため、起動と終了を繰り返すと空いた場所が斑になっていきます。ディスクの断片化と同じような原理です。これを解消することをディスクの場合はデフラグと言いますがメモリの場合はコンパクションと言います。MacOS9までの旧MacOSで仮想メモリオフで使用されてたことのある方は経験があるかもしれませんが、しばらく使っているとまだ物理メモリに余裕があるのにメモリが足りませんというエラーが出たことあると思います。これは上記のようにメモリをセグメント単位で管理しているのでアプリケーションが終了したときに空く穴が不定形で次にはまるものが無ければそこは使用できませんのでまだ余裕があるのにエラーになります。仮想メモリがオンになっていると一度仮想メモリのエリアに乗せて物理メモリ上をコンパクションして元に戻す(詰める)ことができますのでメモリを効率よく利用できるという利点も仮想メモリは持っています。Windowsも旧MacOSほどではありませんが、アプリケーション毎に確保するメモリの大きさなどが違いますのでメモリの断片化は起こります。

前置きが長くなってしまいましたが、コンパクションにもいろいろ方法があるのですが、大規模に一気コンパクションしたいときは物理メモリに乗っているものすべてを退避できるだけは最小で最大は欲しいところですので、これが理由かどうかわかりませんがUnix系では物理メモリと同じ量が推奨になっていることが多いです。

ページングファイルの設定値は諸説ありますが、この辺から当サイトでのページングファイルの設定値は物理メモリの100%〜150%という見解とさせていただきます。

サーバーOSではリブートは滅多な事では許されないのでこういったインテリジェンスなメモリ管理が必要なのですが、Windowsで言えばXPはアプリケーション動かしたままユーザーの切り替えが出来ますのである意味サーバーのような使い方もできるのでクライアントOSでも多少なりとも実装されていると思います。このほかにもページングファイルはエラーログなどにも使用されていますのでサーバーOSでページングファイルが無いのは論外と言って良いと思いますOS自らのコンパクション以外にもユーティリティでコンパクションを行えるものもあります。

ちなみにWindows9x系ではたしかこういったページングファイルの使われ方はされていなかったはずですので仮想メモリ(ページングファイル)はただ物理メモリを食いつぶしたときの保険でしかないので無ければ無いで良いものと思います。(仮想メモリの管理がかなり下手なので9x系では出来るだけ小さく、使わせないように設定する方が良かったと思います。)

最後にDAW向けのチューニングではページングファイルなしは以上のように一般的に推奨できません。

ただ物理メモリが十分あってWindowsをかなりストイックにチューニングしたい方はありだとは思いますが、通常OSはページングファイルありが前提になっていますので合わせてレジストリのチューニングが必要になり、またページングファイルを利用するのはメモリ量が足りなくなったときの一種の保険でもありますので、例えばコップに水を入れるとして溢れたときにページングファイルがあればそれが受け皿(逃げ場所)になりますので、床にこぼれることはありませんが、なければそのまま床にこぼれてしまいますので最悪CubaseやNuendoなどのDAWホストからVST呼び出し時メモリ不足に陥ってDAWホストを巻き込んで落ちることがあるかもしれませんのでその辺を踏まえた上で検討してください。

どうしてもページングファイルなしをやりたい場合は個人的な目安として例えば普段の使うであろう最大のメモリ使用を量ってみて512MBで足りているときに物理メモリが1GBあるとき、マージンとして2倍程度確保できるならやってみても良いとおもいます。