Partager via


Device-Dedicated Threads

Le pilote d’un appareil lent ou d’un appareil rarement utilisé (comme le contrôleur de disquette) peut résoudre de nombreux problèmes d'« attente » en créant un thread système dédié à l’appareil. En outre, la plupart des pilotes de système de fichiers utilisent des threads de travail système et fournissent des routines de rappel worker-thread.

Si un pilote de périphérique a son propre contexte de thread ou s’exécute dans un contexte de thread système, le thread dédié au périphérique ou la routine de rappel worker-thread du pilote de niveau supérieur peut synchroniser les opérations sur un objet répartiteur, tel qu’un objet d’événement ou un objet sémaphore, dans une région de communication partagée de l’extension de périphérique du pilote. Par exemple, un thread dédié à l’appareil peut attendre un objet répartiteur partagé, alors que l’appareil du thread n’est pas utilisé, en appelant KeWaitForSingleObject pour un sémaphore. Tant que le pilote de périphérique n’est pas appelé pour effectuer une opération d’E/S (auquel il définit le sémaphore à l’état Signaled), son thread d’attente n’utilise pas de temps processeur.

Un pilote peut appeler PsCreateSystemThread pour créer un thread dédié au pilote ou au périphérique, puis appeler KeSetBasePriorityThread pour définir la priorité de base du thread. Le pilote doit spécifier une valeur de priorité qui évite les inversions de priorité d’exécution dans les machines SMP. Autrement dit, la définition d’une priorité de base trop élevée d’un thread créé par un pilote peut entraîner des retards dans l’exécution des threads de priorité inférieure qui envoient des demandes d’E/S pour ce pilote.

Étant donné que les objets thread sont eux-mêmes un type d’objet répartiteur, un thread peut attendre qu’un autre thread se termine. Pour obtenir le pointeur d’objet thread associé à un thread, un pilote peut appeler ObReferenceObjectByHandle, en passant le handle de thread reçu de PsCreateSystemThread.

Un thread peut appeler KeDelayExecutionThread pour attendre un intervalle qui peut être une tranche à temps plein ou plus long. La granularité d’un intervalle KeDelayExecutionThread est d’environ 10 millisecondes. Étant donné que KeDelayExecutionThread est une routine pilotée par un minuteur, la granularité de son intervalle est légèrement plus rapide ou plus lente que 10 millisecondes, selon la plateforme.