割り込みアフィニティ

割り込みのアフィニティは、割り込みを処理できるプロセッサのセットです。 各デバイスにはアフィニティ ポリシーがあります。 オペレーティング システムは、アフィニティ ポリシーを使って、そのデバイスの割り込みのアフィニティを計算します。 アフィニティ ポリシーは、デバイスの INF ファイルまたはレジストリ設定で指定できます。

Windows Vista 以降、管理者はレジストリを使って割り込みのアフィニティ ポリシーを設定できます。

管理者は、\Interrupt Management\Affinity Policy レジストリ キーの下に次のエントリを設定できます。

  • DevicePolicy は、アフィニティ ポリシーを指定する REG_DWORD 値です。 使用可能な値とその意味については、IRQ_DEVICE_POLICY をご覧ください。 必要に応じて、既定のポリシーを使用することをお勧めします。

  • AssignmentSetOverride には、KAFFINITY マスクを指定する REG_BINARY、REG_DWORD、または REG_QWORD 値を指定できます。 REG_BINARY の場合、サイズはプラットフォームの KAFFINITY サイズ以下にする必要があり、入力バイト順はリトル エンディアンです。 DevicePolicy が 0x04 (IrqPolicySpecifiedProcessors) の場合、このマスクは、デバイスの割り込みを割り当てるプロセッサのセットを指定します。

ドライバーの INF ファイルは、レジストリ値の既定の設定を提供できます。 INF ファイルで DevicePolicy 値を IrqPolicyOneCloseProcessor に設定する方法の例を以下に示します。 詳しくは、「INF AddReg ディレクティブ」をご覧ください。

[install-section-name.HW]
AddReg=add-registry-section 

[add-registry-section]
HKR, "Interrupt Management\Affinity Policy", DevicePolicy, 0x00010001, 2

システムは、IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP をドライバーに送信するときに、デバイスのドライバーでレジストリ設定を使用できるようにします。 オペレーティング システムは、Type メンバーが CmResourceTypeInterrupt に設定された割り込みごとに、IO_RESOURCE_DESCRIPTOR 構造を提供します。 メッセージ シグナル割り込みの場合、Flags メンバーの CM_RESOURCE_INTERRUPT_MESSAGE ビットが設定されます。それ以外の場合はクリアされます。 u.Interrupt メンバーは、割り込みの設定を記述します。

以下の表に、レジストリ設定と u.Interrupt のメンバーの対応を示します。

レジストリ値 u.Interrupt のメンバー

DevicePolicy

AffinityPolicy

AssignmentSetOverride

TargetedProcessors

KAFFINITY について

KAFFINITY 型は、グループ内の論理プロセッサのセットを表すアフィニティ マスクです。

typedef ULONG_PTR  KAFFINITY;

KAFFINITY 型は、32 ビット バージョンの Windows では 32 ビットであり、64 ビット バージョンの Windows では 64 ビットです。

グループに n 個の論理プロセッサが含まれている場合、プロセッサには 0 から n-1 の番号が付けられます。 グループ内のプロセッサ番号 i は、アフィニティ マスク内のビット i で表されます。ここで、i は 0 から n-1 の範囲です。 論理プロセッサに対応しないアフィニティ マスク ビットは常に 0 です。

たとえば、KAFFINITY 値がグループ内のアクティブなプロセッサを識別する場合、プロセッサのマスク ビットはプロセッサがアクティブな場合は 1、プロセッサがアクティブでない場合は 0 になります。

アフィニティ マスク内のビット数によって、グループ内の論理プロセッサの最大数が決まります。 64 ビット バージョンの Windows の場合、グループあたりのプロセッサの最大数は 64 です。 32 ビット バージョンの Windows の場合、グループあたりのプロセッサの最大数は 32 です。 KeQueryMaximumProcessorCountEx ルーチンを呼び出し、グループあたりのプロセッサの最大数を取得します。 この数は、マルチプロセッサ システムのハードウェア構成によって異なりますが、64 ビット バージョンと 32 ビット バージョンの Windows によって設定される固定の 64 プロセッサと 32 プロセッサの制限を超えることはありません。

GROUP_AFFINITY 構造には、アフィニティ マスクとグループ番号が含まれています。 グループ番号は、アフィニティ マスクが適用されるグループを識別します。

KAFFINITY 型を使用するカーネル ルーチンには、IoConnectInterruptKeQueryActiveProcessorCount、および KeQueryActiveProcessors があります。