プロセッサ グループ

Windows 7 および Windows Server 2008 R2 以降のバージョンの 64 ビット バージョンでは、1 台のコンピューターで 64 を超える論理プロセッサがサポートWindows。 この機能は、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 個のシステムでは、各グループに 64 個のプロセッサを持つ 2 つのプロセッサ グループがあり、各グループに 32 個の論理プロセッサを持つ 4 つのグループはありません。

パフォーマンスを向上させるために、論理プロセッサをグループに割り当てるときに、オペレーティング システムは物理ローカリティを考慮に入れています。 コア内のすべての論理プロセッサと物理プロセッサ内のすべてのコアは、可能であれば同じグループに割り当てられます。 物理的に互いに近い物理プロセッサは、同じグループに割り当てられます。 ノードの容量がグループの最大サイズを超えない限り、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_NUMBER 構造体によって表されます。 レガシ関数で使用される数値プロセッサ番号は、グループ相対です。

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 サポート