メモリその2

では相違点は? というと、

  • Page Fault HandlerはあくまでProcessのWorking setの一部をin/outする。対してSwapperは物理メモリ上にあるProcess全体をin/outする。
  • Page Fault Handlerは、そのPage Faultを発生したProcessのException Handlerから呼び出される形になる。対してSwapperは、対象となるProcessと別のProcessの形で動作し、そのProcessの状態がHibernate→Suspendになった(あるいは逆にSuspend→Hibernateになった)事をトリガーに動作する。
  • Page Faultが扱うPagingの単位はあくまでも1 Page単位である。対してSwappingではProcess単位となる。
  • Page Fault Handlerが実行されるPriorityは、そのPage Faultを起こしたProcessのBase Priorityとなる。対してSwapperとかModified Page Write Request(*1)は、それぞれSYSGENのSWPPRIO及びMPWPRIOにて指定されたPriorityで実施される。

といったあたりだろうか。このあたりでもちょっと触れたが、Windowsは本質的にVMSにおけるSwap Outに該当する処理をなくしたと考えるのが妥当な発想である。だからこそ、WindowsにはPagefile.sysはあってもSwapfile.sysがないのだ。

何でSwapを止めたか、といえばSwap OutしてしまったProcessをIn Swapするのには、ものすごく手間が掛かるからで、これを嫌ったものと想像される。だからWindowsでは、待機状態にあるProcessであっても、Process Headerとごく僅かなWorking Setを必ずメモリ中に残してあるわけだ。これにより、そのProcessが急にStandby状態になっても、割とレスポンスが早く対応できることになる。

ただ、実際に使ってみるとそれもどうだろう? と思うシーンも、ままある。例えばメモリ2GB位積んだマシンの上でPhotoshop(バージョンは何でもいい。筆者は未だに7.0を使い続けている)を起動しておく。ここでメモリの利用量をかなり大きくとっておこう(Photo01)。さて、この状態でPhotoshopを放置し、暫く(半日くらい)他の処理を延々とやってから、いきなりPhotoshopで処理を始めると、暫くの間は遅くて遅くて使い物にならない筈だ。理由は簡単で、Photoshopを放置しておくと、その間にPhotoshopのProcessに割り当てられたWorking Setががんがん減ってゆき、最終的にはProcess Header+最小限のWoring Setにまで落ち込むからだ。勿論PhotoshopのProcessはPage Faultを連発しまくるから、次第にWorking Setは増えてゆくが、それはPhotoshopが希望するほどに十分ではない。

Photo01:筆者の場合。ここまでやると、結構簡単に死ねる。

ここでもちょっと触れたとおり、システム全体の健全性を考え、あるProcessのWorking Set Sizeは序々にしか増えないからだ。結果、Working Set Sizeがある程度まで達するまでの間、Photoshopは非常にスローモーにしか動作しない。どの位スローモーかというと、適当に選択範囲を選んで、自由変形で回転を掛けると、実際に画面が変化するまで数十秒掛かるくらいにスローモーになる(普段は、リアルタイムで画面も変化する)。これがSwappingを行わないWindowsの現実である。

では、仮にWindowsがSwappingをサポートしたらどうなるか? Photoshop起動後暫く放置した段階で、PhotoshopのプロセスがまるごとSwappingされる。この処理は結構時間がかかり、特にDisk I/Oが遅いとかなり待たされる。なので、丁度Disk I/Oをやっていると、体感でも「明らかに遅い」と感じるかもしれない。ただ、それを過ぎるとメモリもまるまる空き、快適に戻る。さて、それから更に暫くしてPhotoshopを呼び出そうとすると、再び猛烈に時間が掛かる。要するにSwap Outと同じだけ(*2)時間がかかると言って良いだろう。この際に、Free Pageを猛烈にかき集める必要があるので、System全体の動きも間違いなく遅くなる筈だ。ただし、これが終わったあとはPhotoshopは快適に使えるはずだ。なぜかというと、例えばPhotoshopが1GBのメモリを占有した状態でSwap outされれば、Swap inされる時にはやはり1GB分のメモリが割り当てられているからだ。なので、ここで変形を掛ければすぐさま反応するようになるだろう。

どっちがよいか、というのは人によって異なるだろうが、個人的にはSwappingをサポートしていても別に損はない、と筆者は思う。にも関わらずSwappingをサポートしていないのはなぜか? という話だが、これはGUIに絡んでくるのではないかと筆者は考えている。

(*1) あるProcessがModified Pageを抱えたままSwap Outすることは許されない。こうしたものは、必ずPage Fileに反映してからSwap Outすることになる。このため、Swap Out時に場合によってはModified Page Writeが発生する事になる。

(*2) 厳密に言えば、HDDへの書き込みとHDDからの読み込みの速度は多少変わってくる。ので、Swap inの方が若干早いかもしれない。