プロセッサ グループ

Windows 7 の 64 ビット版、Windows Server 2008 R2 の 64 ビット版、およびそれ以降の Windows では、1 台のコンピューターで 64 を超える論理プロセッサがサポートされています。 この機能は、32 ビット バージョンの Windows では使用できません。

複数の物理プロセッサを持つシステム、または複数のコアを持つ物理プロセッサを備えたシステムは、オペレーティング システムに複数の論理プロセッサを提供します。 論理プロセッサ は、オペレーティング システム、アプリケーション、またはドライバーの観点から見た論理コンピューティング エンジンの 1 つです。 コア は、1 つ以上の論理プロセッサから構成される 1 つのプロセッサ ユニットです。 物理プロセッサ は、1 つ以上のコアで構成できます。 物理プロセッサは、プロセッサ パッケージ、ソケット、または CPU と同じです。

64 を超える論理プロセッサを持つシステムのサポートは、1 つのスケジューリング エンティティとして扱われる最大 64 個の論理プロセッサの静的セットである、プロセッサ グループの概念に基づいています。 プロセッサ グループには、0 から始まる番号が付けられます。 論理プロセッサが 64 未満のシステムでは、常にグループ 0 という単一のグループが存在します。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: プロセッサ グループはサポートされていません。

システムが起動すると、オペレーティング システムはプロセッサ グループを作成し、論理プロセッサをグループに割り当てます。 システムがプロセッサをホット追加できる場合、オペレーティング システムは、システムの実行中に追加される可能性があるプロセッサのために、グループ内に空き領域を確保します。 オペレーティング システムは、システム内のグループの数を最小限に抑えます。 たとえば、128 個の論理プロセッサを持つシステムでは、各グループに 64 個の論理プロセッサを持つ 2 つのプロセッサ グループがあり、各グループに 32 個の論理プロセッサを持つ 4 つのグループはありません。

パフォーマンスを向上させるために、論理プロセッサをグループに割り当てるときに、オペレーティング システムは物理的な局所性を考慮します。 コア内のすべての論理プロセッサと物理プロセッサ内のすべてのコアは、可能であれば同じグループに割り当てられます。 物理的に互いに近い物理プロセッサは、同じグループに割り当てられます。 ノードの容量が最大グループ サイズを超える場合を除き、NUMA ノードは 1 つのグループに割り当てられます。 詳細については、「NUMA サポート」を参照してください。

プロセッサ数が 64 以下のシステムでは、既存のアプリケーションは変更なしで正常に動作します。 プロセッサ アフィニティ マスクまたはプロセッサ番号を使用する関数を呼び出さないアプリケーションは、プロセッサの数に関係なく、すべてのシステムで正しく動作します。 64 以上の論理プロセッサを搭載したシステムで正しく動作させるには、以下の種類のアプリケーションについて修正が必要になる場合があります。

  • システム全体のプロセッサごとの情報を管理、保守、または表示するアプリケーションは、64 を超える論理プロセッサをサポートするように変更する必要があります。 このようなアプリケーションの例として、システム内の各プロセッサのワークロードを表示する Windows タスク マネージャーがあります。
  • パフォーマンスが極めて重要であり、かつ 64 以上の論理プロセッサを超えて効率的に拡張可能なアプリケーションについては、そのようなシステム上で動作するように修正する必要があります。 たとえば、データベース アプリケーションは変更の恩恵を受ける可能性があります。
  • アプリケーションがプロセッサごとのデータ構造を持つ DLL を使用していて、DLL が 64 を超える論理プロセッサをサポートするように変更されていない場合は、DLL によってエクスポートされた関数を呼び出すアプリケーション内のすべてのスレッドを同じグループに割り当てる必要があります。

既定では、アプリケーションは 1 つのグループに制限されますが、これにより一般的なアプリケーションに十分な処理能力が提供されます。 オペレーティング システムは、最初に、システム内のグループ間でラウンド ロビン方式で各プロセスを 1 つのグループに割り当てます。 プロセスは、1 つのグループに割り当てられた状態で実行を開始します。 プロセスの最初のスレッドは、プロセスが割り当てられているグループで最初は実行されます。 新しく作成された各スレッドは、作成したスレッドと同じグループに割り当てられます。

64 を超えるプロセッサで実行できるように複数のグループを使用する必要があるアプリケーションでは、スレッドを実行する場所を明示的に決定する必要があり、スレッドのプロセッサ アフィニティを目的のグループに設定する必要があります。 INHERIT_PARENT_AFFINITY フラグを使用して、新しいプロセスのアフィニティを生成する親プロセス (現在のプロセスとは異なる場合があります) を指定できます。 プロセスが 1 つのグループで実行されている場合は、同じグループにとどまったまま、GetProcessAffinityMask を使用してそのアフィニティを読み取り、SetProcessAffinityMask を使用して変更できます。プロセス アフィニティが変更された場合、新しいアフィニティがそのスレッドに適用されます。

PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY 拡張属性を CreateRemoteThreadEx 関数とともに使用して、作成時にスレッドのアフィニティを指定できます。 スレッドが作成されたら、SetThreadAffinityMaskを呼び出すか、SetThreadGroupAffinityを呼び出すことによって、そのアフィニティを変更できます。 スレッドがプロセスとは異なるグループに割り当てられている場合、プロセスのアフィニティが更新され、スレッドのアフィニティが含まれるようになり、プロセスがマルチグループ プロセスになります。 個々のスレッドについては、さらにアフィニティの変更を行う必要があります。マルチグループ プロセスのアフィニティは、SetProcessAffinityMask を使用して変更できません。 GetProcessGroupAffinity 関数は、プロセスとそのスレッドが割り当てられているグループのセットを取得します。

ジョブ オブジェクトに関連付けられているすべてのプロセスのアフィニティを指定するには、SetInformationJobObject 関数で JobObjectGroupInformation または JobObjectGroupInformationEx 情報クラスを使用します。

論理プロセッサは、そのグループ番号とそのグループ相対プロセッサ番号によって識別されます。 これは、PROCESSOR_NUMBER 構造体で表されます。 レガシ関数で使用される数値プロセッサ番号は、グループ相対です。

64 以上のプロセッサをサポートするためのオペレーティング システムのアーキテクチャの変更については、ホワイトペーパー 64 以上のプロセッサを搭載したシステムのサポートを参照してください。

プロセッサ グループをサポートする新しい関数と構造体の一覧については、プロセスとスレッドの新機能を参照してください。

Windows 11 と Windows Server 2022 以降での動作

注

Windows 11 および Windows Server 2022 以降では、アプリケーションが既定で 1 つのプロセッサ グループに制限されることはなくなりました。 代わりに、プロセスとそのスレッドにはプロセッサ アフィニティがあり、既定では、64 を超えるプロセッサを持つマシン上の複数のグループにわたって、システム内のすべてのプロセッサにまたがっています。

アプリケーションが 64 個を超えるプロセッサを搭載したマシン内のすべてのプロセッサを自動的に利用できるように、Windows 11 および Windows Server 2022 以降では、OS が変更され、プロセスとそのスレッドがシステム内のすべてのプロセッサ (すべてのプロセッサ グループ) に既定でまたがるようになりました。 つまり、複数のプロセッサ グループにアクセスするために、アプリケーションでスレッドのアフィニティを明示的に設定する必要がなくなりました。

互換性の理由から、OS では、プロセスとスレッドの両方に新しい プライマリ グループ 概念が使用されます。 各プロセスには作成時にプライマリ グループが割り当てられます。既定では、そのすべてのスレッドのプライマリ グループもプロセスと同じです。 各スレッドの理想的なプロセッサはスレッドのプライマリ グループ内に存在するため、スレッドはプライマリ グループのプロセッサに優先的にスケジュールされますが、他のグループのプロセッサにスケジュールできます。 グループを認識しない、または単一のグループに対して動作するアフィニティ API は、暗黙的にプライマリ グループをプロセス/スレッドのプロセッサ グループとして使用します。新しい動作の詳細については、以下の「備考」セクションを参照してください。

アプリケーションでは、CPU セット を使用して、複数のプロセッサ グループに対するプロセスまたはスレッドのアフィニティを効果的に管理できます。

複数のプロセッサ

NUMA サポート