Partager via


Threads spécifiquement dédiés aux appareils

Le pilote d’un appareil lent ou d’un appareil que vous utilisez rarement (comme un lecteur CD/DVD) peut résoudre de nombreux problèmes « en 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 de threads de travail.

Si un pilote de périphérique a son propre contexte de thread ou s’exécute dans un contexte de thread système, il peut utiliser des objets de synchronisation pour la coordination. La routine de rappel du thread de travail dédié au dispositif ou au pilote de niveau supérieur peut synchroniser les opérations sur un objet de répartiteur, comme 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 de répartition partagé, tandis que l’appareil du thread n'est pas en cours d'utilisation, 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, son thread en attente n’utilise pas de temps processeur. Lorsque le pilote est appelé, il définit le sémaphore à l’état Signaled.

Un pilote peut appeler PsCreateSystemThread pour créer un thread dédié au pilote ou à l’appareil, 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é au moment de l’exécution dans les machines SMP. Autrement dit, la définition de la priorité de base d’un thread créé par un pilote trop élevé peut entraîner des retards dans l’exécution de 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 la fin d’un autre thread. 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. La granularité d’un intervalle KeDelayExecutionThread est d’environ 10 millisecondes. Étant donné que KeDelayExecutionThread est une routine pilotée par le minuteur, la granularité de son intervalle est légèrement plus rapide ou plus lente que 10 millisecondes, selon la plateforme.