プロセスその18

対するWindowsは? というと、話がもう少し複雑化する。まず、CPUが単純なものだけではない。一つはPentium 4に搭載されたHyper-Threadingの様な、いわゆるSMT(Simultaneous Multi-Threading)を搭載したケース、もう一つはNUMAのケースだ。それぞれ「ハイパースレッディング」(上巻P415~)と「NUMAシステム」(上巻P416~)に詳しいが、ここで影響が大きいのはNUMAだろう。このケースでは、ProcessがどのCPU上のメモリを使っているか、を理解しないでスケジューリングすると、致命的に重い負荷がかかる事になる(それに比べてHyper-Threadingはそれほど大した問題とは言えない)。このNUMAをサポートするために、Context Switchingにおける「次にどのProcessを選ぶか」の手順は大幅に異なってきている。ただVMSの香りを未だに保っているのが、Affinityである。Windowsにおけるアフィニティの説明は上巻P419~に記載されているが、このAffinityという概念はやはりVMSにも存在する。こちらの目的もWindows同様(というか、時期から考えれば当然、Windowsの方がVMS同様となるのだろうが)に、あるProcessが特定のCPU上で実行できるようにするためのものである。

VMSの場合、Implicit AffinityとExplicit Affinityの2種類をサポートしている。Impricitの場合は「このCPUで実行する」になるし、Explicitの場合は「このCPUでは実行しない」が指定できる。各ProcessのPCBの中にはCPB$V_IMPLICIT_AFFINITYとCPB$V_EXPLICIT_AFFINITYと呼ばれるbit fieldがあり、例えばCPB$V_IMPLICIT_AFFINITYのbit 0を立てると、そのプロセスはCPU #0でしか実行されないし、逆にCPB$V_EXPLICIT_AFFINITYのbit 1を立てると、そのプロセスはCPU #1では絶対実行されない事になる。

こうした指定が必要なのは、例えばKernel Routineが全部ばらばらのCPUで動いて居たりしたら、IPLで同期を取るのが大変(不可能では無いが、Latencyが増える)といった事情による。またもう少し広い範囲で見ると、適切なキャッシュを搭載したCPUが出現した場合、同一CPU上で動くプロセス同士でプロセス間通信を行うのは高速だが、異なるCPUにまたがった場合、バスを経由することになり遅くなる場合がある。一部のリアルタイム向けシステムなどでは、これは重大な問題になりえるからだ。

このあたりは、そっくりそのままWindowsに引き継がれているように見える。bit fieldが32bit(なので、一つのOSで管理できるCPUの数が32個までとなる)なあたりも全く同じだ。ただし、Explicit Affinityはサポートしておらず、あくまでImplicit Affinityのみの模様だ(Photo01)。上巻P419で説明されているSetThreadAffinityMask()を見ても、マスクは1種類しか無いようだ。正直、Explicit Affinityが有用なケースというのは余り思いつかない。例えばASMP環境で、CPU #0~#2がCPU処理用、CPU #3がI/O処理用なんて割り当て方をしている場合、殆どのプログラムにはExplicit AffinityにCPU #3を指定しておくと便利ではあるが、逆にImplicit AffinityにCPU #0~#2を設定しても良い訳で、これはやや冗長と見なされたのではないかと思う。

Photo01:Windows XPのTask Managerでプロセスを選び、右クリックで「関係の設定...」を選ぶと、Processor Affinity設定画面が出現する。

WindowsにおけるAffinityで面白いのは、ThreadのみならずProcessレベルでも指定ができること。そのためにSetProcessAffinityMask()なんて関数も用意されているし、変わったところではSetThreadIdealProcessor()なんて関数も用意されていたりする。この関数の処理は「理想と最後のプロセッサ」(上巻P422~)に説明があるが、これに該当する概念はVMSには無い。また、Windowsの場合はプログラムの作成時にAffinityを指定することが出来る(「実験:イメージアフィニティを変更する」(上巻P421))が、これに相当する機能はVMSには無い(ので、プログラムの中からSystem Serviceを呼び出して設定を行うことになる)。このあたりに、特にNUMAのサポートなどで積極的にAffinityを使わざるを得ないが故に機能を充実させたWindowsの事情が見えてくる。