2010-02-05

XPのメモリ割り当ての戦略に関して

XPのメモリ戦略の悪さというのは、以外に知られていないらしい。はてブやTwitterで、これに関するコメントが目立つ。これは、一概にXPが悪いとも言えない。当時の環境もある。

たしか、私の記憶では、Mark Russinovich氏が、Channel9の動画で、分かりやすく説明していたはずだ。しかし、今探そうとしても、Channel9自体に繋がらない。仕方がないので、私の知識で説明しようと思う。

私の記憶では、XP発売当時、メモリをたったの64MBとか128MBだけ搭載して売っていた、メーカー製のパソコンがあったはずだ。しかも、GPUはマザボ内臓だ。それでも、たしか十数万円ぐらいしたと記憶している。完全にボッタクリ価格であった。

私は、パソコンをBTOでパーツを指定して注文した。たしか、私がPCを買ったのは、2002年だったはずだが、メモリを1GB積んでいた。その当時(今もあまり変わらないが)、メーカー製のPCは、実にボッタクっていた。そのため、まともなスペックを求めるならば、自作するか、BTOで買うしかなかったのである。これは、今も変わらない。

しかも、メーカー製のパソコンには、最初からcrapware満載である。あれも親切で入れているのではなく、広告料が入ってくるから入れているに違いない。実にばかげたことだ。

もちろん、メーカーは、信じられないほどマヌケなユーザーのサポートをする必要がある。

「あのー、もう机の端まで来てしまったので、これ以上マウスを動かせないんですけど?」

「電源コードが刺さっていないはずはない! 絶対に刺さっている! 私に間違いはない! 本当だ! 何? ホコリがついているかもしれないから、一度抜いて、ホコリを払ってから、もう一度させだと? 仕方がない。それほどいうなら、ホコリを払うだけは、やってやるか。いいか、特別にわざわざやってやるんだぞ・・・・・・ふーむ動いたようだ。でも電源コードは確かに確実に刺さっていた! 本当だ!」

客、パソコンは立ち上がっているかと聞かれ、にわかに椅子から立ち上がって、答える。
「はい、立ち上がってます!」

あのボッタクリ価格は、かなりの部分が、サポート料である。

要するに当時、キャッシュに使えるようなメモリなんて、存在していなかったのだ。

メモリというと、いろいろと都市伝説が広がっている。

まず、物理メモリ。これは、マザボに刺さっている、物理的なメモリである。この容量は、どうしようもない。

しかし、物理メモリを使うのは、甚だ不便である。そこで、Windowsは、仮想メモリという概念を導入している。これは、仮想的なメモリアドレスを、プロセスごとに、独立して割り当ててやる。仮想アドレスのうち、実際必要な部分だけ、物理アドレスを割り当てるのである。

しかし、物理メモリには限りがある。そのため、スワップと呼ばれる、データを一時的に保管しておく記憶領域を確保する。スワップはどこに置かれるかというと、大抵は、HDDである。スワップからの読み込みは遅いので、できれば避けたい。

このようにして、少ない物理メモリ上で、見かけ上、物理メモリより多くのメモリを使うことができるのである。

ここまでが、非常に簡単で誤解を恐れずに書いた導入部である。より詳しく知りたい人は、Windows Internalsや、この辺の記事を参考して欲しい。

Mark's Blog : Pushing the Limits of Windows: Physical Memory
Mark's Blog : Pushing the Limits of Windows: Virtual Memory
Mark's Blog : Pushing the Limits of Windows: Paged and Nonpaged Pool
Mark's Blog : Pushing the Limits of Windows: Processes and Threads

ちなみに、昔、メモリクリーナー、メモリ最適化ツール、などという詐欺ソフトウェアが流行っていたが、これは何の意味もなさない。なぜなら、プロセスごとに独立した仮想アドレスを与えられるので、これらのソフトは、単に仮想アドレス―物理アドレスの変換キャッシュを、高速なCPUのキャッシュから、遅いメモリ上にスワップアウトさせるだけである。

さて、Windowsは、各プロセスに、物理メモリを割り当てなければならない。しかし、物理メモリは限りがあるので、到底、全プロセスの全仮想メモリに割り当てることなどできはしない。では一体どうするのか。

プロセスというのは、常に動いているわけではない。メモリは大量に使っているが、ほとんどアクセスしないプロセスというものもある。とすれば、そんなプロセスに、貴重な物理メモリを割り当てるより、ユーザーが今使っているプロセスに、優先してメモリを割り当てた方が得である。スワップからの読み込みは遅いが、物理メモリを割り当ててやれば、速い。ユーザーが今使っているプロセスが、一番多く、メモリを割り当てられてしかるべきである。

Windows XPでは、メモリは少なかった。そのため、Windowsは、積極的にメモリを解放しようとした。フォアグラウンドウインドウのプロセスに、最優先で割り当て、ひとたび、ウインドウが最小化になったならば、全力で物理メモリを回収にかかった。スワップにさえデータを保持しておけば、いざ必要となっても、すぐに取り出せるのである。だから、少なくとも、プログラムが動かなくなるということはない。

ところが、これはたとえば、あるアプリケーションを放置したまま、別のアプリケーションを長時間使って、さて、またあるプログラムを使おうとすると、そのアプリケーションのメモリ内容は、すべてスワップの中という事態を引き起こすのである。その場合、Windowsは、全力で物理メモリを他プロセスから回収して、そのプログラムのプロセスに割り当て、必死こいてスワップからデータを読み込まなければならない。この処理が終わるまで、メモリは読み込めない。ユーザーは、しばらく反応のないアプリケーションのウインドウを見て、「これだからパソコンという奴は遅くて使いものにならないんだ」とストレスをためるのである。

これは、スリープからの復帰や、しばらくパソコンを放置した後にも起こる。

では、Vista以降はどうか。Vistaが出た当初、自称パワーユーザー(笑)達は、Vistaのタスクマネージャを見て驚いた。「なんと、何もアプリケーションを起動していないのに、空きメモリがないではないか!」と。これをもって、自称パワーユーザー(笑)は、Vistaというのはメモリをバカ食いする使えないOSだと結論した。この論法は、間違っている。

Vistaの時代では、メモリは余っていたのである。もはや、1GB以上のメモリを積んでいるパソコンが当たり前になっていた。メーカー製のボッタクリPCは、いまだに256MBのメモリでVista対応を謳っていたが、時代は変わったのである。余ったメモリを何に使うか。キャッシュである。

Vistaは、メモリをできるだけ使う。プロセスに割り当てられたメモリを、ウインドウが最小化二なったからといって、即座に嬉々として解放することもないし、余ったメモリは、ディスクキャッシュにあてている。HDDは遅い。HDDの速さは、実は、10年前から、それほど劇的に変わっていないのである。それどころか、HDDのシーク時間は、今も昔も、常に10ミリ秒はかかる。メモリをあるだけキャッシュに使うのは、理にかなっている。

もちろん、キャッシュとして使われているメモリは、必要となれば、すぐにプロセスに割り当てることができる。なぜなら、HDD内に、本物のデータがちゃんと存在するのだから、すぐにメモリ内容を破棄して、プロセスに割り当てても問題ないからだ。

XPのメモリ戦略は、現代からみれば貧弱である。しかし、当時の時代背景を考えれば、一概にMSを責めることもできないのである。

よく、これからはWebアプリですべてを行えるようになるので、ハードウェアやOSの違いは、どうでも良くなる。もはやハードウェアやOSをアップデートする必要はない。などという意見を聞く。しかし、残念ながら、現実は、この理想には程遠い。

ハードウェアはまだまだ進化する。実際、まだハードの速度は足りない。また、ハードウェアに合わせたソフトウェアが必要である。現代のWindowsの実装は、十年後には、ハードの進化によって、時代遅れになっているだろう。その時代にあわせて、実装し直さなければならないのだ。

たとえば、Vista以降のWindowsは、DWMを使って、デスクトップの描画を、かなりGPUに頼るようになっているが、これも、XPの時代には、まったく実用的ではなかった。GPUがプログラマブルになった今だからこそ、実用になるのである。

2 comments:

Anonymous said...

×バックグラウンド
○最小化

江添亮 said...

それもそうだ。