Device-Dedicated Threads
Der Treiber eines langsamen Geräts oder eines Geräts, das selten verwendet wird (wie der Diskettencontroller), kann viele "wartende" Probleme lösen, indem er einen dedizierten Geräte-Systemthread erstellt. Darüber hinaus verwenden die meisten Dateisystemtreiber Systemarbeitsthreads und bieten Workerthread-Rückrufroutinen.
Wenn ein Gerätetreiber über einen eigenen Threadkontext verfügt oder in einem Systemthreadkontext ausgeführt wird, kann der dedizierte Gerätethread oder die Workerthread-Rückrufroutine des Treibers Vorgänge für ein Dispatcherobjekt, z. B. ein Ereignisobjekt oder ein Semaphorobjekt, in einer freigegebenen Kommunikationsregion der Geräteerweiterung des Treibers synchronisieren. Ein gerätededizierter Thread kann beispielsweise auf ein freigegebenes Dispatcherobjekt warten, während das Gerät des Threads nicht verwendet wird, indem KeWaitForSingleObject für ein Semaphor aufgerufen wird. Bis der Gerätetreiber aufgerufen wird, um einen E/A-Vorgang auszuführen (an diesem Punkt wird der Semaphor auf den Signalzustand festgelegt), verwendet sein wartende Thread keine CPU-Zeit.
Ein Treiber kann PsCreateSystemThread aufrufen, um einen treiber- oder gerätespezifischen Thread zu erstellen, und dann KeSetBasePriorityThread aufrufen, um die Basispriorität des Threads festzulegen. Der Treiber sollte einen Prioritätswert angeben, der Laufzeitprioritätsinversionen auf SMP-Computern vermeidet . Das heißt, das Festlegen der Basispriorität eines vom Treiber erstellten Threads zu hoch kann zu Verzögerungen bei der Ausführung von Threads mit niedrigerer Priorität führen, die E/A-Anforderungen für diesen Treiber übermitteln.
Da Threadobjekte selbst ein Typ von Dispatcherobjekten sind, kann ein Thread warten, bis ein anderer Thread abgeschlossen ist. Um den einem Thread zugeordneten Threadobjektzeiger abzurufen, kann ein Treiber ObReferenceObjectByHandle aufrufen und das von PsCreateSystemThread empfangene Threadhandle übergeben.
Ein Thread kann KeDelayExecutionThread aufrufen, um auf ein Intervall zu warten, das ein Vollständiger Slice oder länger sein kann. Die Granularität eines KeDelayExecutionThread-Intervalls beträgt etwa 10 Millisekunden. Da KeDelayExecutionThread eine timergesteuerte Routine ist, ist die Granularität des Intervalls je nach Plattform etwas schneller oder langsamer als 10 Millisekunden.