メモリその7

図2がProcess Headerの構造となる。先頭には固定サイズの管理ブロックが入るが、これはProcessの生成日時や親Process、権限、Quantum、etc...が含まれる、ごく一般的なものである。これに続き、Working Set ListとかProcess Section Tableの列が入る事になる。この領域に入るエントリは、当然ながらWorking Set Sizeによって増減することになる。だからといって、領域のサイズそのものまでダイナミックに増減させると処理に手間が掛かって仕方が無い。そこで領域のサイズはSYSGENパラメータで設定するようになっている。この後にEmpty Pageが来るのは、例えばWorking Setが何らかの理由で肥大化し、Process Section Tableの領域を食い尽くして更に広がろうとしたときに役に立つ。この領域は物理的にメモリがMappingされていないので、ここにアクセスしようとしてもAccess Violationが発生するので、これ以上データ構造を破壊する事が無い。勿論当該Processはこれ以上処理が続行できなくなるが、他のProcessのProcess Headerを破壊する危険性が無くなるだけでもだいぶ安全になると言える。これに続き、P0とP1用にそれぞれPTEが並ぶ形になる。

図2:VMSのProcess Header

面白いのはこのProcess Header、それ自身をSwap Outすることも可能である。実際メモリ構造が全部Outswapされるのだから、Process HeaderをSwap outしてしまってもさして問題はない。またProcess HeaderはPaga MemoryとNon Paging Memoryの両方から構成されている。巨大なWorking Setを持つProcessは、そのProcess Headerも当然巨大になる。これを全部Non Page Memoryで賄ったらPagingに割り当てられる実Memoryが減ってしまうからだ。

ところで、PTEの先頭にはValid bitがあるという話をした。Processに割り当てられているPageは必ずこのbitが1になっている。では、1になっていないものにはどんなものがあるか? というのをまとめたのが図3である。一番上はValid bitが1、つまり図1の状態をもう少し細かく示したもので、Reservedの中身も入れたものである。全てに共通するのは前回説明したProtection Codeともう一つはOwner Access Modeである。このOwner Access Modeは、そのPageを作成したProcessが、そのPageの属性を変更したり、あるいはPageを削除することが、現在のProcessの特権レベルで可能か否かを示すものである。またWindow bitというのは、そのPageがPFNでMappingされている(つまり特定のProcessのVirtual Addressに割り当てられている)かどうかを示すbitである。例えばWorking Serがある程度増えるケースを考える。すると、まずは物理メモリを確保にゆき、確保できたらこれにあたるPTEを作成するわけだが、この時点ではまだVirtual AddressにMAPされていないから、Window bitは0である。その後、特定のMemory AddressにMapされた時点で、このbitが1になるわけだ。要するに、Window bitはこれに続くPage Frame Numberの値に意味があるかどうか、を示す指標と考えれば良い。

図3:PTEのバリエーション

さて、ではその他のPTEは? というと、何れもValid bitが0である。これは、「そのPageが不正」というよりは、まだVirtual AddressにMapされていない事を示している。

Demand zero pageは、内容が0クリアされたPageを、要求に応じて生成した事を示す。Page is in transitionは、ProcessのVirtual AddressからUnmapされたものの、まだ内容を退避しておらず、このPageがModified page listにつながれている状態であることを示す。

Invalid global pageは、対象がProcessのPrivate AddressではなくGlobal sectionのPageであり、これがProcessからUnmapされていることを示す。この場合、そのProcessのVirtual AddressからUnmapされたといって勝手にそのPageを削除するわけにいかないので、とりあえずこの状態にして、Unmapしていることを示す。

Page is in page fileは、そのPageがPage fileとMemoryの間で移動中であることを示している。ここで出てくるPage FileのVBN(Virtual Block Number)というのは、VMS上で動くRMS(Record Management Service)というファイルシステム特有のもので、ファイル先頭からの相対位置である。PCの世界で言えば、IDEのLBAみたいなもの、と考えれば良い。ここでVirtualなのは、あくまでファイルという論理構造の中での先頭からの位置であり、物理的なセクタの位置を示すわけではないことを示している。ちなみにRMSでも1セクタは512Byteになっており、1page=1セクタの関係が維持されているために、当該ページの位置がVBNで一意に示される形になっている。

最後のPage is in image fileは、FileからSection(それがPrivate sectionなのかGlobal sectionなのかはここでは問わない)にMappingしている状況で、当該PageがFileとMemoryの間を移動中という話である。