プロセッサ グループ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Windows 11 および Windows Server 2022 以降の動作

Note

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

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

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

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

複数のプロセッサ

NUMA サポート