プロセスその11

Pagingに対応する話は前回までで大まかに説明したが、他にNon Pageと呼ばれるメモリ領域が存在する。VMSではこれをSectionと呼び、各Process毎に独立したProcess-Private Sectionと、System Wideで共有できるGlobal Sectionと呼ばれる2種類が存在する。この名前はWindowsにも継承され、Section Object(上巻P527)として実装されている。

Inside Windowsでの説明では、Section Objectの目的をもっぱら複数Process間でのメモリ共有という形で説明しているが、これは間違いではないものの、正確とも言えない。というのは、別に共有しなければSection Objectを作れないという訳ではないし、作成後に共有する必要性そのものは無いからだ。WindowsにおけるSection Objectの目的は、たとえば7.2.5 共有メモリとマップドファイル(上巻P448~)で示されるように、実行ファイルのコード部とかDLLなどを共有するのに便利、という説明がなされているが、これは実は本質的ではない。

VMSの場合、SectionはPaging対象外のMemory Areaを作成するための手段である。たとえばVMSの場合、Connect-to-Interruptと呼ばれる、特殊なデバイスハンドリング方法がある。これは要するにDevice Interruptが入ってISRがKernel Modeで起動するときに、そこからUser ISRを呼び出せるというちょっと変わった仕組みだ。この仕組み、VMSの中でもUnibusもしくはQ22busと呼ばれるバスを使ったデバイスに限られるのだが、要するに割り込み応答時間を削減する仕組みである。通常ならばInterruptが入るとDriverのISRが動作し、これがDevice ForkでPost ISR Routineをキューイングする。従って主要なI/O完了処理はこのPost ISR Routineの中で行うのが本筋であるが、これだとInterrupt発生からPost ISR Routine起動までの間の時間が多めになる上、Post ISR Routineの起動までの時間が保証できない。そこで、よりリアルタイム要件が強いケースでは、Device ISRから直接User ISRを呼び出して、ここでPost I/O Routineの代わりを務めさせる事ができる。当然この方法は便利な反面システム全体に無用な負荷を掛ける事になるので、一般的には推奨されていない。さて、問題はこのConnect-to-Interruptで呼び出すUser ISRをどこに置くかという話だ。これを普通のWorking Set管理下のPage上においた場合、そのPageがPage Outされてしまうと、ISRの飛び先がなくなってしまう。このケースでは、Page Inを待つことも出来ない。というのは、Page In/Outを管理しているプロセスはIPL=0で動作し、一方ISRはDevice IPLで動作する。従ってDevice IPLを抜けるまでPage In/Outの作業が出来なくなる。これは典型的なデッドロックであり、これを避けるためにはUser ISRがPaging対象外に置かれなければならない。こうしたケースで利用されるのがPrivate Sectionである。SectionはPage単位で管理される(つまりPFN Databaseの管理下にある)が、WSLXなどには登録されない。このため、端的に言えばそのProcessがSWAP Outされてもメモリ中に残る。このPageが開放されるのは、そのProcessが消滅した時である。

Private SectionではまたFileのMappingにも利用される。この話はInside Windowsにもちょっとだけ出てくるが(上巻P449~451)、もう少し理屈から説明したい。多くの仮想記憶OSにおいて、FileのRandom Accessを行う最速の方法はFileの内容をMemory Mappingすることだ。なぜかと言うと、仮想記憶のPaging/Swappingという処理と同じメカニズムが利用できるからだ。Paging/Swappingもやはりファイル(Pagefile/Swapfile)(*1)を開き、こことメモリの間で煩雑にデータの移動や参照を行う事が必須であり、これが遅いとシステム全体の速度が遅くなる関係で、このメカニズムはかなり高度にチューニングされている。このメカニズムをそのまま使うのだから、アクセスが遅い訳がない。ただ当然ながらこのメカニズムは、既存のFile Accessのライブラリとは互換性が無いし、色々と制約もあるのだが、そうした制約があっても高速にFile Accessを行いたい場合には有用な手段である。

さて、問題はこのFile Mappingを行う場合のメモリをどうするかだ。ここでWorkingSet対象の領域に展開した場合、Page Outが発生する可能性がある。Page Outの是非はともかく、これが発生してしまうと、対象とするFileとPage File、場合によってはSwap Fileで同じデータを重複して持つことになる。これはいかにも馬鹿馬鹿しい。(続く)

(*1) VMSの場合、Page FileとSwap Fileは別に確保される。Windowsではこれが共通化された。