次の方法で共有


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 が現在のプロセッサに割り当てられていて ImportanceLowImportance ではない場合、または ImportanceLowImportance で、現在のプロセッサの DPC キューの深さがシステム定義の限度値を超えているか、DPC 要求のレートがシステム定義の最小値を下回っている場合に、DPC キューの処理が直ちに始まります。 それ以外の場合、キューの深さとレートに関する該当の要件が満たされるまで DPC の処理は後送りされます。

  • DPC が現在のプロセッサとは別のプロセッサに割り当てられていて、ImportanceMediumHighImportance または HighImportance の場合、またはターゲット プロセッサの DPC キューの深さがシステム定義の制限値を超えた場合に、ターゲット プロセッサで DPC キューの処理が直ちに始まります。 それ以外の場合、キューの深さとレートに関する該当の要件が満たされるまで DPC の処理は後送りされます。