プロセスその17
さて、その先は? というと、これはもうかなりインプリメントが変わってきている。具体的に言えば、6.5.13のマルチプロセッサシステム(上巻P412~)の部分は、(Windows NT 3.1時代がどうだったか、はともかく)現在のWindows XP/Windows Serverではかなり手が入っており、もうVMS時代のMethodは影も形もなくなっている。
VAXの場合、確かハイエンドのVAX9000シリーズでは4つ、ミッドレンジの最終製品であるVAX6660で6つ、VAX9000登場まではハイエンドに君臨していたVAX8978が8つという具合に複数のCPUを搭載しており(ちなみに最初のマルチプロセッサマシンはVAX11/782という、2つのVAX11/780を共有メモリ経由で繋ぐという代物だった)、VMSも当然これをサポートしていたが(ただしSMPとしてサポートしたのはVMS 5.0から。VMS 4.x台はASMPとしてのサポートだった)、マシンの構造そのものは非常に単純で、ソフトウェアから見るとPentium IIIの時代までのIntelアーキテクチャと大差ない。またNUMA(Non-Unified Memory Architecture)への配慮は一切なく、当然の様にUMA(Unified Memory Architecture)のみのサポートだった。
こうしたケースにおいては、スケジューリングにはそれほど悩む必要がない。VMS 5.0における基本方針として、
- Kernel Modeは常にCPU #1が実行する
- User Modeは全てのCPUに均等に配分する
という仕組みがとられることになった。厳密に言えばこれはSMPではない、という考え方もあるが(実際、Kernel Modeの稼動中は他のCPUが全部止まる事になる)、ただCPU時間におけるKernel Modeの頻度はそれほど多くないから、これはこれで合理的であり、かつASMP構成だったVMS 4.xからの移行を容易に行えるというメリットがあった。ただ、流石にこれは問題があると思ったのか、VMS 5.2では、
- Spin Lockを保持した処理は常にCPU #1が実行する
というインプリメントがなされている。このSpin Lockというのは、要するにInter-Processor間で同期を取るためのセマフォみたいなものである。これを実現するために、VAXには、
- ADAWI Add aligned word/interlocked
- BBCCI Branch on bit clear and clear/interlocked
- BBSSI Branch on bit set and set/interlocked
- INSQHI Insert entry into queue at head/interlocked
- INSQTI Insert entry into queue at tail/interlocked
- REMQHI Remove entry from queue at head/interlocked
- REMQTI Remove entry from queue at tail/interlocked
の7命令が用意された。この命令は、System中のinterlock memoryという特殊なメモリエリアに対するものであり、あるCPUがそのメモリエリアに対して処理中は、他のCPUは一切アクセスできないことが保証されている。最初の3命令はMutexを構成するためのものだし、次の4命令は複数の値を持つセマフォを構成するために使える。
余談だがx86の場合、LOCK命令をADD / ADC / AND / BTC / BTR / BTS / CMPXCHG / CMPXCH8B / DEC / INC / NEG / NOT / OR / SBB / SUB / XOR / XADD / XCHGの何れかの命令とあわせて発行することで、その命令がシステム全体でユニーク(Atomic)に発行される事が保障されるようになっている。INSQHI / INSQTI / REMQHI / REMQTIの類の命令は存在しないが、これ無しでは実装不可能という訳ではないと判断したのであろう。
さて話を戻す。例えば218回目で出てきたSCH$QENDの処理の中でSchedulerが呼ばれる訳だが、このSchedulerはSCB(System Control Block)とかPCB(Process Control Block)を操作することになる。これらのBlockを操作するのがSchedulerだけならば良いが、実際には他にも多くの処理がこのBlockを参照したり変更しようとしたりしている。VMSがSingle Processorの場合、ここの排他制御はIPLで行っていたが、Multi-Processorだと原理的には複数のCPU上で同じIPLを保持した別Processが動作する可能性があるわけで、これを防ぐためにInterlockを使うというわけだ。ただこれらの処理は、SMPをサポートしたOSではさして珍しい話ではない。