DPC キューの構造
システムは、プロセッサごとに DPC キューを 1 つ提供します。 ドライバーは、システムがどの DPC にキューを割り当てるか、キューで DPC が占める場所、およびキューが処理される時期を制御できます。
特定のプロセッサのキューに割り当てられている DPC は、そのプロセッサで実行されます。 既定では、ドライバーで KeInsertQueueDpc または IoRequestDpc が呼び出されると、現在アクティブなプロセッサ上で DPC がキューに置かれます。 ドライバーは、KeInsertQueueDpc または IoRequestDpc を呼び出す前に、KeSetTargetProcessorDpc を呼び出すことによってプロセッサ キューを指定できます。
Windows Vista 以降の Windows では、スレッド化された DPC キューもプロセッサごとに 1 つあります。 ドライバーでは、KeSetTargetProcessorDpc を使用して、スレッド化された DPC のプロセッサ キューを指定できます。
KeSetImportanceDpc ルーチンは、キュー内部での DPC の配置先を制御します。 多くの場合、DPC はキューの末尾に配置されます。ただし、ドライバーが Importance パラメーターに HighImportance を指定して KeSetImportanceDpc を先に呼び出すと、DPC はキューの先頭に配置されます。
スレッド化されていない通常の DPC の場合は、KeInsertQueueDpc または IoRequestDpc のどちらで DPC キューの処理を直ちに開始するかも KeSetImportanceDpc によって決まります。 キューを処理するための規則は次のとおりです。
DPC が現在のプロセッサに割り当てられていて Importance が LowImportance ではない場合、または Importance が LowImportance で、現在のプロセッサの DPC キューの深さがシステム定義の限度値を超えているか、DPC 要求のレートがシステム定義の最小値を下回っている場合に、DPC キューの処理が直ちに始まります。 それ以外の場合、キューの深さとレートに関する該当の要件が満たされるまで DPC の処理は後送りされます。
DPC が現在のプロセッサとは別のプロセッサに割り当てられていて、Importance が MediumHighImportance または HighImportance の場合、またはターゲット プロセッサの DPC キューの深さがシステム定義の制限値を超えた場合に、ターゲット プロセッサで DPC キューの処理が直ちに始まります。 それ以外の場合、キューの深さとレートに関する該当の要件が満たされるまで DPC の処理は後送りされます。