Freigeben über


Gerätespezifische Threads

Der Treiber für ein langsames Gerät oder ein Gerät, das Sie selten verwenden (z. B. ein CD/DVD-Laufwerk), kann viele "wartende" Probleme lösen, indem ein gerätededizierter Systemthread erstellt wird. Darüber hinaus verwenden die meisten Dateisystemtreiber Systemarbeitsthreads und stellen Workerthread-Rückrufroutinen bereit.

Wenn ein Gerätetreiber über einen eigenen Threadkontext verfügt oder in einem Systemthreadkontext ausgeführt wird, kann er Synchronisierungsobjekte für die Koordination verwenden. Der gerätebezogene Thread, oder die Worker-Thread-Rückrufroutine des Treibers, kann Vorgänge für ein Dispatcherobjekt, z. B. ein Ereignisobjekt oder ein Semaphorobjekt, in einem freigegebenen Kommunikationsbereich der Geräteerweiterung des Treibers synchronisieren. Beispielsweise kann ein gerätededizierter Thread 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, verwendet sein Wartethread keine CPU-Zeit. Wenn der Treiber aufgerufen wird, wird das Semaphor in den Signalzustand versetzt.

Ein Treiber kann PsCreateSystemThread aufrufen, um einen treiber- oder gerätededizierten Thread zu erstellen, und dann KeSetBasePriorityThread aufrufen, um die Basispriorität des Threads festzulegen. Der Treiber sollte einen Prioritätswert angeben, der Inversionsversionen der Laufzeitpriorität 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 eine Art Dispatcherobjekt sind, kann ein Thread warten, bis ein anderer Thread abgeschlossen ist. Um den Threadobjektzeiger abzurufen, der einem Thread zugeordnet ist, kann ein Treiber ObReferenceObjectByHandle aufrufen und das threadhandle übergeben, das von PsCreateSystemThread empfangen wurde.

Ein Thread kann KeDelayExecutionThread aufrufen, um auf ein Intervall zu warten, das eine volle Zeitscheibe oder länger sein könnte. Die Granularität eines KeDelayExecutionThread-Intervalls beträgt etwa 10 Millisekunden. Da KeDelayExecutionThread eine zeitgebergesteuerte Routine ist, ist die Granularität des Intervalls je nach Plattform etwas schneller oder langsamer als 10 Millisekunden.