デバイス専用スレッド

低速デバイスのドライバーや、使用頻度の低いデバイス (フロッピー コントローラーなど) は、デバイス専用のシステム スレッドを作成することで、多くの "待機中" の問題を解決できます。 さらに、ほとんどのファイル システム ドライバーは、システム ワーカー スレッドを使用し、ワーカー スレッド コールバック ルーチンを提供します。

デバイス ドライバーに独自のスレッド コンテキストがある場合、またはシステム スレッド コンテキストで実行されている場合、デバイス専用スレッドまたは最上位ドライバーのワーカー スレッド コールバック ルーチンは、ドライバーのデバイス拡張の共有通信領域で、イベント オブジェクトセマフォ オブジェクトなどのディスパッチャー オブジェクトに対する操作を同期できます。 たとえば、デバイス専用スレッドは、セマフォに対して KeWaitForSingleObject を呼び出すことによって、スレッドのデバイスが使用されていない間、共有ディスパッチャー オブジェクトを待機できます。 I/O 操作を実行するためにデバイス ドライバーが呼び出されるまで (その時点でセマフォを Signaled 状態に設定します)、待機中のスレッドは CPU 時間を使用しません。

ドライバーは PsCreateSystemThread を呼び出してドライバー専用スレッドまたはデバイス専用スレッドを作成し、KeSetBasePriorityThread を呼び出してスレッドの基本優先度を設定できます。 ドライバーでは、SMP マシンでの実行時の優先順位の反転を回避する優先度の値を指定する必要があります。 つまり、ドライバーによって作成されたスレッドの基本優先度を高く設定すると、そのドライバーの I/O 要求を送信する優先度の低いスレッドの実行に遅延が発生する可能性があります。

スレッド オブジェクト自体はディスパッチャー オブジェクトの一種であるため、スレッドは別のスレッドが完了するまで待機できます。 スレッドに関連付けられているスレッド オブジェクト ポインターを取得するために、ドライバーは、PsCreateSystemThread から受信したスレッド ハンドルを渡して ObReferenceObjectByHandle を呼び出すことができます。

スレッドは KeDelayExecutionThread を呼び出して、完全なタイム スライス以上の間隔を待機できます。 KeDelayExecutionThread 間隔の粒度は約 10 ミリ秒です。 KeDelayExecutionThread はタイマー駆動型ルーチンであるため、その間隔の粒度は、プラットフォームに応じて 10 ミリ秒より少し高速または低速になります。