プロセスその22

実際、EventとCritical Section、それにShared Memoryを組み合わせることで、Mailboxと同等の機能は比較的容易に構築できる。単なるMessage PassingであればShared Memory上に領域を用意しておき、ここにアクセスするときには必ずCritical Sectionを介在させるという約束を作り、ついでに何か書き込んだ際にはEventを発生させる事にすれば、それで出来上がりである。Message Queuingが必要なら、Shared Memoryの上にQueue構造(単なるLink Listで十分だろう)を構築すれば済む話だ。Win32 APIにはQueue構造を簡単に構築するAPIはない(.NET FrameworksにはSystem.Collectionsの中にQueue Classが存在する)が、別に双方向Link Listであってもそれほど作るのが難しい訳ではない。

もう一つ理由を挙げると、VMSではProcessが最小単位だったから、Process間のMessage交換方法を充実させる必要があったが、WindowsではThreadが最小単位となる。したがって、Process空間のVirtual Memoryを共用して動く事になるわけで、無理にMailboxなどを使わなくても、Message交換方法は非常に簡単に可能であるというか、何もしなくてもメモリ空間を共有しているわけで、なのでThread間の同期だけ取れれば十分という判断だったのだろう。実際、VMSでは処理の関係で無理にProcess分割を行っていたものが、WindowsではThread分割で実現できるから、そもそもMailboxへのニーズが前ほどには無い、と判断されても不思議ではない。

そんなわけでMailboxは削られ、その代わりにEventが多用されるようになったわけだが、これは前回も述べたように、WindowsにおけるWindow System(要するにGUIを司る部分)が本質的にEvent Drivenなメカニズムであり、これをOS Kernelの中に深く組み込んでしまったWindowsとしては他の選択肢は無かったと言っても良いだろう。

次にShared Memoryについて触れたい。Shared Memoryの技法そのものはそれほど珍しいものではない。要するに仮想記憶のメカニズムを使い、ある物理メモリを複数プロセスの仮想メモリ空間に同時に割り当てるという仕組みだ。これは別にVMSに限らず、仮想記憶をサポートしたOSならばごく普遍的にサポートされるメカニズムである。というのは、単にVirtual Address→Physical Addressの変換の際に利用されるPTE(Page Table Entry)への値の入れ方を工夫するだけで良いからで、追加コストが殆ど掛からずに実現できる事になる。

また、殆どの仮想記憶OSは、物理メモリが不足してSwappingを発生した場合の退避場所としてHDDを利用出来る。したがってPage Out/Page Inという操作をHDDに対して行う必要があり、大体の場合この操作はHDDアクセスの中で最速である。これをそのまま利用することで、ファイルをMemory上に展開する事が可能になる。これをWindowsではMemory Mapped File(7.2.5 上巻P448~)と称しているが、これに関してはVMSもほぼ同様の機能を持っている。ただこれはVMSから継承された、というよりも当然持つべき機能を備えたというレベルであって、VMSの影響を受けたとは言えないだろう。強いてVMSとの差を挙げればCopy on Writeのハンドリング(7.2.8 上巻P456~)が追加された程度だろう。ただ、これは別に共有メモリ云々の話ではなく、メモリ管理一般の話である。

一般にある親Processから子Processを生成する際に、親Processのリソースを継承するのが普通だが、メモリ空間をいちいち完全コピーしていると遅くなるし、メモリの無駄も多い。そこで、WindowsはUNIX同様にCopy on Writeと呼ばれる技法を導入することで、Read Onlyのページに関しては親Processのそれを流用する、という話である。このメカニズムはVMSには無い(ので、Process毎に完全にコピーを作成する)という話であるが、これは共有メモリとは余り関係ない。

話を戻すと、このShared MemoryとMemory Mapped File、WindowsではSection Objectとして管理される(7.8 上巻P525~)。この内部だが、VMSのそれと比較するとだいぶ異なっている。大きな理由の一つはファイルシステムが異なっている(のと、これを扱うためのファイルシステムサービスが異なっている)あたりにあるようだ。本質的には1種類(RMS:Record Management Service)のファイルシステムしかサポートしないVMSと、FAT/NTFSに加えてHPFS(OS/2のファイルシステム)などもサポートした(*1)Windowsでは事情が違う、ということだろう。

(*1)サポートはWindows 2000で打ち切られた。