メモリその8

つまるところ、ProcessがMapしているPageは、全てPTEでこまかく状態が管理されているということがここでわかる。幾分管理は煩雑ではあるが、こちらの図1の様に、PTEだけでPageの管理を行っているから(*1)、複数の管理テーブルをいちいち変更する必要はないわけで、トータルのオーバーヘッドそのものはそれほど大きくないという事だろう。

勿論PageTableがPage Outされていたりすると、アクセスには猛烈に時間がかかる事になるが、ProcessのWorking Memoryが残っていてPage TableがPage Outされるというケースは原則としてありえない(Page Tableは最後にPage Outされるようになっている)。勿論ProcessのWorking Setを極小にすると、理屈上はPage Tableすら入らなくなってPage Outという可能性も無くはないのだが、こうした状況はそもそもパラメータの設定が間違っているのであって、そうした状況でプロセスが動かなくなってもそれはユーザーの責任ということになるだろう。シチュエーションとしては、こうした状況でProcessが動くとは思えないから実害は無いとは思うのだが、仮にP0ないしP1空間の一部がPage Inしており、これが稼動したことによってメモリアクセスが発生、ところがその場合に当該PTEを含む部分がPage Outしてたなんて事になると、Page Inまでの間Kernelが止まりかねない。このあたりはIDSにも詳細は無いが、普通に考えた場合Page InしているPageのPTEを含むブロックは、必ずPage Inするような仕組みがPage In/Outのメカニズムに含まれていると考えて良いだろう。実際処理は簡単で、

  • 先頭(つまりValid bit)が立っているPTEを含むPageはPage Outしない
  • あるPageをPage Inする際に、そのPageにあたるPTEがPage Outしている場合、そのPTEを含むPageもPage Inする

というルールを実装すれば済むからだ。このあたりが、管理ブロックを一箇所に集中しているメリットとも言える。

翻ってWindowsを見ると、これは結構複雑である。ただここでも書いたとおり、IA32のMMUの構造はMicrosoftがどうにかできるものではなく、つまるところこれに合わせるしかないので、管理が煩雑になるのは致し方ないという判断だろう。何でこんなMMUの構造をとったかといえば、やはり「1プロセスで4GBも使うのはまだずっと先だ」という判断があったからではないか、と思う。Page Tableの上位にPage Directoryを新設したのは、例えば各ProcessはPage Table+Offsetで動作し、OSはPage Directoryを管理する形でシステムのPartitioningを簡単に行うなんて事が念頭に無かったとは言い切れないと思う。弊害は、当然アクセスが遅くなる(まずPage Directoryをアクセスしないと、PageTableを特定できない)事で、実際にはメモリアクセスを伴うからレイテンシは決して少なくない(昨今のプロセッサはともかく、最初にこのメカニズムを実装したi386はキャッシュを持たない事に注意されたい。後継のi486も、8KBのキャッシュを搭載しただけである)。まぁそれでも間に合うくらいに当時はゆっくり動いていた、ということでもあるが、それにしても性能面へのペナルティは決して少なくなかった筈である。ただ、それを敢えて行ったからこそ、柔軟性が増したともいえなくはない。

もう一つ、VAXとの大きな違いは、IA32ではセグメントの考え方が未だに残っていることだ。残っているどころか、使われてすらいるというのがちょっと凄いところですらある。例えばIntelで言うNXbit、Windowsで言えばDEPのハンドリングであるが、当初はセグメント単位でこれを行っていた。その後、PAEを有効にした場合、もしくはIA-32eモードを使った場合には、Page単位で管理できるようになったが、Windowsは従来Advanced Serverかそれ以上でなければPAEをサポートしなかった。DEPはハードウェアが無くても動作できる(OSがPage単位で管理する)が、NXbitをサポートしているCPUならばプロセッサで行わせたほうが当然高速である。ところが、そうなると32bit Windowsではセグメントの管理までしなければいけなくなる。これを嫌った結果が、7.2.7(上巻P454)にあるような対策(CPUにこの機能がある場合、DEPを有効にするとPAEモードでOSを立ち上げる)というインプリメントなのだろうと想像される。Microsoftも、これ以上セグメントで悩まされるのはいやだったらしい。

(*1) 厳密にはProcess Section Tableがあるのだが、これはPageそのものではなくGlobal Section/Private Sectionを管理するものなので、ここでは措いておく。