プロセッサ数の変更

動的にパーティション分割可能なサーバーでは、いつでもプロセッサをハードウェア パーティションに追加できます。 したがって、ハードウェア・パーティション内のアクティブ・プロセッサーの数、プロセッサー・アフィニティ値、または各アクティブ・プロセッサーに割り当てられるプロセッサー番号に関する前提は一切しないでください。 プロセッサ アフィニティ値に設定されているビットは、ハードウェア パーティション内の現在アクティブな各プロセッサを表します。 プロセッサをハードウェア パーティションに追加すると、設定される特定のビットが変更されます。

次のいずれかのステートメントがデバイス ドライバーに当てはまる場合は、プロセッサがハードウェア パーティションに動的に追加されるときに、動的にパーティション分割可能なサーバーで正常に機能するようにドライバーを更新する必要があります。

  • デバイス ドライバーは、ハードウェア パーティション内のアクティブなプロセッサの数を使用して、割り当てるメモリの量、作成するスレッドの数、使用するその他のリソースの量など、使用するリソースの量を決定します。 この状況では、プロセッサがハードウェア パーティションに動的に追加された場合、デバイス ドライバーのリソース割り当てが正しくありません。 これは、ドライバーのパフォーマンスまたは動作に悪影響を与える可能性があります。

  • デバイス ドライバーは、プロセッサ アフィニティ値のビットをウォークします。 このような状況では、デバイス ドライバーがプロセッサアフィニティ値の動的な変更を処理できない場合、または設定されているビットのシーケンスのギャップを処理できない場合は、正しく動作しない可能性があります。

  • デバイス ドライバーは、プロセッサ アフィニティ値のビットを使用して、ドライバーによって割り当てられたリソースを特定のプロセッサに割り当てます。 この状況では、プロセッサがハードウェア パーティションに動的に追加された場合、デバイス ドライバーのリソース割り当てが正しくありません。 これは、ドライバーのパフォーマンスまたは動作に悪影響を与える可能性があります。

  • デバイス ドライバーは、ハードウェア パーティション内のアクティブなプロセッサごとにデータ構造を割り当てます。 このような状況では、デバイス ドライバーは、ハードウェア パーティションに動的に追加されたプロセッサのこれらのデータ構造にアクセスしようとすると、悪影響、データの破損、またはバグ チェックが発生する可能性があります。

  • デバイス ドライバーのディスパッチ ルーチンは、データ構造またはその特定のプロセッサに割り当てられている他のリソースにアクセスするために、実行されているプロセッサのプロセッサ番号を使用します。 このような状況では、デバイス ドライバーのディスパッチ ルーチンは、ハードウェア パーティションに動的に追加されているプロセッサのこれらのリソースにアクセスしようとすると、悪影響、データの破損、またはバグ チェックが発生する可能性があります。

  • デバイス ドライバーは、割り込みサービス ルーチン (ISR)、遅延プロシージャ呼び出し (DPC)、または特定のプロセッサ上の他のスレッドをスケジュールします。 このような状況では、ハードウェア パーティションにプロセッサを追加すると、デバイス ドライバーが正しく機能しなくなり、新しいプロセッサを完全に使用できなくなる可能性があります。

  • デバイス ドライバーは、リソースの再調整をサポートしていません。 この状況では、デバイス ドライバーは割り込みを処理するためにハードウェア パーティションに追加された新しいプロセッサを使用できません。

  • デバイス ドライバーは、負荷分散アルゴリズムを使用して、複数のプロセッサ間で I/O 要求の処理を分散します。 このような状況では、ハードウェア パーティションにプロセッサを追加すると、デバイス ドライバーが正常に動作しなくなり、新しいプロセッサを完全に活用できなくなる可能性があります。

デバイス ドライバーがアクティブなプロセッサの数の変更の影響を受ける場合は、ハードウェア パーティションにプロセッサを追加するときに通知を受け取るために、オペレーティング システムに自身を登録する必要があります。 デバイス ドライバーが通知されると、安全で最適な操作のために必要に応じて応答できます。 デバイス ドライバーがオペレーティング システムに自身を登録する方法の詳細については、「 ドライバー通知」を参照してください。

ハードウェア パーティション内のアクティブなプロセッサの現在の数を取得するには、デバイス ドライバーは 、KeQueryActiveProcessorCount 関数を呼び出す必要があります。 現在のプロセッサ アフィニティ値を取得するために、デバイス ドライバーは KeQueryActiveProcessors 関数または KeQueryActiveProcessorCount 関数を呼び出すことができます。

手記 デバイス ドライバーがハードウェア パーティション内のアクティブなプロセッサごとにデータ構造を割り当て、新しいプロセッサのデータ構造のメモリ割り当てに失敗した場合にデバイス ドライバーが失敗した場合、デバイス ドライバーは、オペレーティング システムがサポートするプロセッサの最大数を処理するドライバーの初期化中にこれらのデータ構造の十分な割り当てを行うことができます。 この状況では、新しいプロセッサをハードウェア パーティションに追加するときに、デバイス ドライバーは新しいデータ構造を割り当てる必要はありません。 ただし、これらのデータ構造のサイズが非常に小さい場合を除き、これはメモリ リソースの非効率的な使用になる可能性があります。 デバイス ドライバーは、 KeQueryMaximumProcessorCount 関数を呼び出すことによって、オペレーティング システムがサポートするプロセッサの最大数を照会できます。

大事な デバイス ドライバーは、ハードウェア パーティションにプロセッサを追加したことを通知されたときに、アクティブなプロセッサの数とプロセッサ アフィニティの保存された値を常に更新する必要があります。

大事な デバイス ドライバーは、ハードウェア パーティション内のアクティブなプロセッサの数を決定するプロセッサ アフィニティ値のセット ビットの数をカウントしないでください。 デバイス ドライバーでは、この目的のために KeQueryActiveProcessorCount 関数を呼び出することをお勧めします。 この関数は、アクティブなプロセッサの数と、関連付けられているプロセッサ アフィニティ値の両方を返します。

大事な Windows Vista、Windows Server 2008 以降のバージョンの Windows 用にビルドされたデバイス ドライバーでは、 KeNumberProcessors カーネル変数を使用して、ハードウェア パーティション内のアクティブなプロセッサの数を決定することはできません。 KeNumberProcessors カーネル変数は、Windows Vista Service Pack 1 (SP1)、Windows Server 2008、およびそれ以降のバージョンの Windows では廃止されています。