次の方法で共有


ワーク キューのディスパッチ メカニズム

RDBSS では、Windows カーネル作業キューを使用して、後で実行するために複数のスレッドに操作をディスパッチします。 ネットワーク ミニ リダイレクター ドライバーは、後で実行するために操作をディスパッチするために RDBSS によってメインされた作業キューを使用できます。

RDBSS には、RDBSS で使用されるディスパッチ メカニズムを実装するいくつかのルーチンが用意されています。 これらのルーチンは、ネットワーク ミニ リダイレクター ドライバーでも使用できます。

RDBSS は、デバイス オブジェクトごとに作業項目を追跡します。 これにより、RDBSS は、ネットワーク ミニ リダイレクターの読み込みとアンロードに関連する競合状態を処理できます。 また、RDBSS では、1 つのネットワーク ミニ リダイレクターがすべてのリソースを不正に使用するのを防ぐためのメカニズムも提供されます。

作業項目のディスパッチが避けられないシナリオもあります。 これらのシナリオで頻繁にメモリ割り当てを回避し、操作を解放するために、WORK_QUEUE_ITEM は別のデータの一部として割り当てられます。 ディスパッチがまれな他のシナリオでは、必要になるまでメモリ割り当てを回避するために料金が発生します。 RDBSS 作業キューの実装では、これらのシナリオの両方に対して、作業キュー要求のディスパッチとポストの形式が提供されます。 RxDispatchToWorkerThread ルーチンを使用してディスパッチする場合、呼び出し元が WORK_QUEUE_ITEM のメモリを割り当てる必要はありません。 RxPostToWorkerThread ルーチンを使用して投稿するには、呼び出し元が WORK_QUEUE_ITEM のメモリを割り当てる必要があります。

ワーカー スレッドに操作をディスパッチする一般的なケースは 2 つあります。

  • 非常に頻度の低い操作の場合は、 RxDispatchToWorkerThread ルーチンを使用して、作業キュー項目のメモリを必要なときに動的に割り当てて解放することで、メモリの使用を節約します。

  • 操作が繰り返しディスパッチされる場合は、 RxPostToWorkerThread ルーチンを使用して、ディスパッチするデータ構造の一部として WORK_QUEUE_ITEM を事前に割り当てることで時間を節約します。

2 つのディスパッチ操作の間のトレードオフは、時間と領域 (メモリ使用量) です。

RDBSS のディスパッチ メカニズムは、プロセッサごとに複数レベルの作業キューを提供します。 現在サポートされている作業キューのレベルは次のとおりです。

  • 重大

  • Delayed

  • HyperCritical

重大と遅延の区別は、優先度の 1 つです。 HyperCritical レベルは、ルーチンがブロックしない (リソースを待機する) という点で、他の 2 つのレベルとは異なります。 この要件を適用できないため、ディスパッチ メカニズムの有効性は、クライアントの暗黙的な協力に依存します。

RDBSS での作業キューの実装は、KQUEUE 実装を中心に構築されています。 追加のサポートには、作業項目をアクティブに待機している多数のスレッドの制御が含まれます。 各作業キューのデータ構造は、非ページ プール メモリから割り当てられ、独自の同期メカニズム (スピンロック) を備えています。

RDBSS では、ブックキーピング情報 (キューの状態や種類など) に加えて、作業キューの有効期間中に収集される統計もメインされます。 これにより、作業キューのチューニングに関する重要な情報が得られます。 処理された項目の数、処理する必要がある項目の数、および累積キューの長さが構造化されています。 累積キューの長さは重要なメトリックであり、追加の作業項目がキューに登録されるたびに処理されるのを待機している項目の数の合計を表します。 累積キューの長さを、処理された項目の合計数と処理する項目数の合計で割った値は、平均キュー長を示します。 1 より大きい値は、作業キューに関連付けられているワーカー スレッドの最小数を増やすことができることを示します。 1 未満の値は、キューに関連付けられている作業スレッドの最大数を減らすことができることを意味します。

通常、作業キューはアクティブな状態で開始され、回復不可能な状況 (システム リソースの不足など) が発生するか、非アクティブ状態に移行するまで続行されます。 ランダウンが開始されると、rundown-in-progress 状態に遷移します。

スレッドがスピンダウンされると、作業キューのランダウンは完了しません。 データ構造を取り壊す前に、スレッドの終了を確実に行う必要があります。 RDBSS での作業キューの実装は、スピンダウンされる各スレッドがランダウン コンテキストでスレッド オブジェクトへの参照を保存するプロトコルに従います。 ランダウン発行スレッド (作業キューに属していません) は、データ構造を破棄する前に、スピンダウンされたすべてのスレッドの完了を待機します。

RxDispatchToWorkerThread キューと RxPostToWorkerThread キューの現在の実装は、呼び出し元と同じプロセッサで動作します。

作業キューディスパッチのための次の RDBSS ルーチンが含まれます。

ルーチンによって返される値 説明

RxDispatchToWorkerThread

このルーチンは、ワーカー スレッドのコンテキストでルーチンを呼び出します。 WORK_QUEUE_ITEM のメモリは、このルーチンによって割り当てられます。

RxPostToWorkerThread

このルーチンは、ワーカー スレッドのコンテキストでルーチンを呼び出します。 WORK_QUEUE_ITEM のメモリは、呼び出し元によって割り当てられている必要があります。

RxSpinDownMRxDispatcher

このルーチンは、ネットワーク ミニ リダイレクターのディスパッチャー コンテキストを破棄します。

このルーチンは、Windows Server 2003 および Windows XP でのみ使用できます。