[~W2K8 / W2K8R2] Windows on Windows (WOW) の最大サポート CPU 基数はいくつ?

皆様御機嫌よう、ういこです。
今日は、せっかく今期から Windows SDK 一家の軒下を借りるようになったので、たまには Windows API についてのことでも書いてみようと思います。
Windows API というか、Windows の仕組みの話になっちゃいますが…。

Windows Server 2008 R2 から、64bit CPU に特化されましたことは、これまでのサーバー製品が 64bit 版にどんどんシフトしていっている流れ的にさもありなん、という感じはあったものの、ついにきたなという思いでした。ただ、64bit CPU が出てかなり時間が経つとはいえ、既存のアプリケーション資産は 32bit でビルドされたもの(32bit Windows 上で動作することを想定して作成されたものという意味)がまだまだ現役で動いている、という状況が大半ではないでしょうか。

Windows On Windows (WOW)
Windows OS では、64bit OS 上でも、32bit アプリケーションを動作させる仕組み "Windows On Windows" というサブ システムがあります。32bit アプリケーションは、このサブ システム上で動作します。あくまでもサブ システムなので、エミュレーションしているようなものです。そのため、厳密に 32bit Windows と同じ動作にはならないことがあることに注意しなくてはなりません。昔、Windows が出始めのころ、コマンド プロンプト上で DOS アプリケーションを動かした方で、挙動が微妙に違うと悩んだかたもいらっしゃるでしょう。それと同じことになることを頭に入れる必要があります。

CPU の最大サポート基数について
サーバー上で動作させるアプリケーションである場合、WOW 上で動作させるにしても、プロセッサを最大限使いたいというかたもいらっしゃると思います。そうした場合、WOW はいったい何基までの CPU をサポートするのでしょうか?
答えは、32 基までとなります。ドキュメントは、残念なことに本社の人にも聞いてみましたが、以下の MSDN のドキュメントくらいしか書いていないようです。

Processor Affinity (プロセッサの親和性)
https://msdn.microsoft.com/en-us/library/aa384228(VS.85).aspx

<--- 抜粋ここから ---->
32-bit Windows supports a maximum of 32 processors.
Therefore, functions such as GetProcessAffinityMask
simulate a computer with 32 processors when called under WOW64.
<--- 抜粋ここまで ---->

・Windows Server 2008 までの場合 (64bit アプリは 64 基、WOW は 32 基)
64 bit Windows OS の内部では、アプリケーションの動作の際に 64bit プラットフォーム上で動作することを前提としてビルドされているか、それ以外を対象としてビルドされたものかという判断を行っています。プロセッサ数は、MAXIMUM_PROCESSORS という定数で設定されており、以下のとおりとなります。

・64bit アプリケーションの場合 64 基

・それ以外の場合 32 基

・Windows Server 2008 R2 の場合 (64bit アプリは 256 基だが WOW は相変わらず 32 基)
Windows Server 2008 までの Windows の仕組みでは、ロック機構の実装にまだまだ改善の余地があり、64 基以上のプロセッサの場合動作が遅くなる可能性などがあり、上記のように 64 基までということになっていました。しかし、Windows Server 2008 R2 では、ある一人のすごい人がこのロックの実装ロジックを解決することができたそうです。(うわさではその人は勇者としてリアルにアワードをゲットしたとか…)
また、R2 では、CPU が複数あるマルチコア環境下で、Non-Uniform Memory Access (NUMA) の強化が行われています。
NUMA というのは耳慣れない言葉かと思いますが、実は結構前から概念はあったようです。これは、CPU をグループとして管理し、効率よく使おうとする見たいなことのようです。(プロセッサ グループはカーネルが決定) このグループ化の仕方がいい感じになり、1 スレッドを処理するコア = 1 論理プロセッサとして扱い、同一コア中の論理プロセッサ、同一の物理プロセッサ内のコア、物理に近い論理プロセッサなど、近隣の論理プロセッサ同士を同一のグループにすることで、バスのデータ転送の効率を上げようともくろんだようです。ちなみに NUMA グループは "ノード" という言葉で表現されるみたいです。

そして、256 基までサポートされるならば WOW もあわよくばサポート基数が増えたのでは…と思ったのですが、残念ながら WOW はあいかわらず 32 基でございます。
また、物理スロットは 64 基までです。なのに 256??

…実は、この 256 のからくりは、64 基 x 最大 4 ノード = 256 基、ということでして、なぜ WOW は 32 基なのかというと、32 基 x 1 ノード = 32 基ということだったりするのでした。

WOW 上での動作を見る際はお気をつけくださいませ。

ういこう@明日は小学校が臨時休校!?