プロセスその5

ちょっとJobのわき道に逸れたが、話をProcessに戻したい。そんなわけでWindowsにおいてはJobと無関係に、いきなりProcessが作られる事になるが、このシーケンスを説明しているのが6.2 CreateProcessの動作フロー(上巻P350~)になる。図6-5(上巻P352)がこのフローを端的に示しており、最初の親プロセスは「プロセス生成」→「EXEファイルをMapping」ではなく「EXEファイルを開いてMapping」→「プロセス生成」の順で作られるというあたりに面白さを感じはするが、それほど不思議な訳ではない。ProcessとThreadが密接に関係しているので、Processを生成すると、自動的に初期Threadも生成され、これが実行されるあたりはVMSと大きく違うが、これはここまで説明してきたとおり、VMSとWindowsでシステムの前提が異なっている以上、当然といえる。

さて、この一連の作業の中で、まずWindowsプロセスオブジェクトの生成(6.2.2:上巻P356)の中をちょっと見てみたい。ステージ2Aと2Bの手順(上巻356~357)を見ていると、見慣れない「Working Set」なる用語があるのに気がつくはずだ。このWorking Setの説明は7.9「ワーキングセット」(上巻P534~)に詳しいが、端的に言えば各プロセスに割り当てるメモリの量である。この実装はOSによって多少変化しており、実際Windows 2000までとWindows XP/Windows 2003で異なる部分がある事が、7.10.2「ワーキングセットの管理」(上巻P541)で語られている。このWorking Setなる概念は、まるっきりVMSからの継承である。そこでまずはVMSにおけるProcess管理のMemory管理をちょっとご紹介したい。

まず、Working Setという概念の必要性である。VMSに限らず、仮想記憶の仕組みをサポートしたOS一般の話として、各プロセスにどれだけの実メモリを割り当てるか、という問題は常に付きまとう。仮想記憶の場合、理論上はHDDを併用することで32bitマシンならプロセスあたり4GBまでのメモリを利用することができる。勿論半分はOSに取られたりするから、実際に使われるのは2GBまで(*1)というのが普通だが。さて、この2GBをフルに使うことは、それほど難しくない。要するにHDD上のPaging Fileに2GB以上の空きがあればいいわけで、プロセス自身は2GBのメモリ空間を自由に使うことが出来る。

ただ、実際のメモリはここまで実装されているわけではない。今でこそ、Windows Vistaのお陰(?)で、デスクトップですら最低1GB、快適に使うには2GBのメモリが必要という話になって、無意味に大量のメモリが実装されるようになったが、以前は128MBとか256MBなんてマシンも少なくなかったし、Windows NT 4.0の時代は32MBなんてマシンも普通だった。もっと遡ると、VAXアーキテクチャの初代であるVAX-11/780の場合、勿論構成は変更可能だったが当初は1MBのメモリという構成を選ぶケースが非常に多かった。まぁそれも当然で、当時の1MBのメモリボードが当初は数千万とかいう値段だったと記憶している。いまでこそ1GBが4000円を切ったとかそーいう話であるが、1978年当時だと4KBのメモリボードが4万とかいう時代であり、実際にはECC回路やらその他のオプションも入るから、1億まで行かないだけマシという世界だ。こんな環境において、アプリケーションが要求するからとホイホイメモリを割り当てられるマシンなんぞ何十億掛かるか判ったものではない。実のところ、当時のVAXの使われ方は、1台のマシンの下に数十ユーザーがTSS形式でぶら下がるというものだから、例えば20人としても1MBメモリだと50KBにしかならない計算だ。実際にはOSが使う分もあるから、一人当たり割り当てられる量はもっとずっと少なかったりする。こうした状態を考えると、メモリは貴重なリソースであり、なるべく節約することを考えなければならない。

ただその一方で、むやみにケチっても意味がない。というのは、例えばあるプロセスが2MB分のメモリを使うが、割り当てメモリが100KBしかなかったとする。この場合、必要とする2MBのメモリ空間のうち100KB分だけはメモリに置き、残りの1.9MB分はPage Fileに格納、必要に応じて読み出す形になる。ここでプロセスが煩雑にメモリアクセスを繰り返す様な場合、結果としてHDDアクセスが猛烈に発生することになり、システム全体のスループットに致命的な影響を及ぼす事になる。これが激しくなるケースが、俗に言うthrashing(スラッシング)である。thrashingには2種類あり、一つは上の様にある特定のプロセスがMemory accessに伴ってHDDへのI/O要求を猛烈に出すようになり、結果としてシステムが動かなくなるというパターン、もう一つはメモリ不足のために不要なプロセスの追い出し(Swap Out)を掛けている途中にそのプロセスの呼び出しが発生してしまい、結果としてSwap In/Outでシステムが動かなくなるパターンだ。(続く)

(*1)これは環境次第で色々変わる。たとえばWindows XP/2003の場合、boot.ini内の起動パラメータに"/3GB"を付加すると、ユーザープロセスが3GBまでのメモリを利用できる。あるいはPAEやPSEを使えばもっと大量のメモリを扱える。なので、2GBというのはあくまで一般的な話として受け止めてほしい。