Partager via


Minuteurs haute résolution

À compter de Windows 8.1, les pilotes peuvent utiliser les routines exXxxTimer pour gérer les minuteurs haute résolution. La précision d’un minuteur haute résolution est limitée uniquement par la résolution maximale prise en charge de l’horloge système. En revanche, les minuteurs limités à la résolution d’horloge système par défaut sont beaucoup moins précis.

Toutefois, les minuteurs à haute résolution nécessitent que les interruptions de l'horloge du système se produisent à un taux plus élevé, au moins temporairement, ce qui a tendance à augmenter la consommation d'énergie. Par conséquent, les pilotes doivent utiliser des minuteurs à haute résolution uniquement lorsque la précision du minuteur est essentielle, et utiliser des minuteurs de résolution par défaut dans tous les autres cas.

Pour créer un minuteur à haute résolution, un pilote WDM appelle la routine ExAllocateTimer et définit l’indicateur EX_TIMER_HIGH_RESOLUTION dans le paramètre Attributes . Lorsque le pilote appelle la routine ExSetTimer pour définir le minuteur à haute résolution, le système d’exploitation augmente la résolution de l’horloge système, si nécessaire, afin que les heures à laquelle le minuteur expire plus précisément correspondent aux durées d’expiration nominales spécifiées dans les paramètres DueTime et Period .

Un pilote KMDF (Driver Framework) Kernel-Mode peut appeler la méthode WdfTimerCreate pour créer un minuteur à haute résolution. Dans cet appel, le pilote transmet un pointeur à une structure WDF_TIMER_CONFIG en tant que paramètre. Pour créer un minuteur haute résolution, le pilote définit le membre UseHighResolutionTimer de cette structure sur TRUE. Ce membre fait partie de la structure commençant par Windows 8.1 et KMDF version 1.13.

Contrôle de la précision du minuteur

Par exemple, pour Windows s’exécutant sur un processeur x86, l’intervalle par défaut entre les cycles d’horloge système est généralement d’environ 15 millisecondes, et l’intervalle minimal entre les cycles d’horloge système est d’environ 1 milliseconde. Par conséquent, le délai d’expiration d’un minuteur de résolution par défaut (que ExAllocateTimer crée si l’indicateur de EX_TIMER_HIGH_RESOLUTION n’est pas défini) ne peut être contrôlé qu’à environ 15 millisecondes, mais le délai d’expiration d’un minuteur à haute résolution peut être contrôlé dans un délai d’une milliseconde.

Si un pilote spécifie une heure d’expiration relative pour un minuteur de résolution par défaut, le minuteur peut expirer jusqu’à environ 15 millisecondes antérieures ou ultérieures à l’heure d’expiration spécifiée. Si un pilote spécifie une heure d’expiration relative pour un minuteur à haute résolution, le minuteur peut expirer jusqu’à une milliseconde après l’heure d’expiration spécifiée, mais il n’expire jamais tôt. Pour plus d’informations sur la relation entre la résolution de l’horloge système et la précision du minuteur, consultez Précision du minuteur.

Si aucun minuteur haute résolution n’est défini, le système d’exploitation exécute généralement l’horloge système à son rythme par défaut. Toutefois, si un ou plusieurs minuteurs à haute résolution sont définis, le système d’exploitation peut avoir besoin d’exécuter l’horloge système à son débit maximal pendant au moins une partie du temps avant l’expiration de ces minuteurs.

Pour éviter d’augmenter inutilement la consommation d’alimentation, le système d’exploitation exécute l’horloge du système à son débit maximal uniquement si nécessaire pour répondre aux exigences de minutage des minuteurs à haute résolution. Par exemple, si un minuteur à haute résolution est périodique et que sa période s’étend sur plusieurs cycles d’horloge système par défaut, le système d’exploitation peut exécuter l’horloge système à son taux maximal uniquement dans la partie de la période du minuteur qui précède immédiatement chaque expiration. Pour le reste de la période du temporisateur, l'horloge système fonctionne à sa vitesse par défaut.

Pour éviter une consommation excessive d’alimentation, les pilotes doivent éviter de définir la période d’un minuteur à haute résolution longue sur une valeur inférieure à l’intervalle par défaut entre les cycles d’horloge système. Sinon, le système d’exploitation est forcé d’exécuter en permanence l’horloge du système à son débit maximal.

À compter de Windows 8, un pilote peut appeler la routine ExQueryTimerResolution pour obtenir l’intervalle de résolutions du minuteur pris en charge par l’horloge système.

Comparaison avec ExSetTimerResolution

Un pilote peut appeler la routine ExSetTimerResolution pour modifier l’intervalle de temps entre les interruptions d’horloge système successives. Par exemple, un pilote peut appeler cette routine pour passer de son taux par défaut à son taux maximal pour améliorer la précision du minuteur. Toutefois, l’utilisation d’ExSetTimerResolution présente plusieurs inconvénients par rapport à l’utilisation de minuteurs à haute résolution créés par ExAllocateTimer.

Tout d’abord, après avoir appelé ExSetTimerResolution pour augmenter temporairement le taux d’horloge système, un pilote doit appeler ExSetTimerResolution une seconde fois pour restaurer l’horloge système à son taux par défaut. Sinon, le minuteur d’horloge système génère en permanence des interruptions à la vitesse maximale, ce qui peut entraîner une consommation excessive d’alimentation.

Deuxièmement, un pilote qui utilise la routine ExSetTimerResolution ne peut pas optimiser son utilisation temporaire des taux d’horloge système plus élevés aussi efficacement que le système d’exploitation pour les minuteurs à haute résolution. Ainsi, l’horloge système fonctionne plus longtemps à la vitesse maximale que nécessaire.

Troisièmement, si plusieurs pilotes utilisent simultanément ExSetTimerResolution pour améliorer la précision du minuteur, l’horloge système peut s’exécuter à son taux maximal pendant de longues périodes. En revanche, le système d’exploitation coordonne globalement l’opération de plusieurs minuteurs haute résolution afin que l’horloge système s’exécute à la vitesse maximale uniquement si nécessaire pour répondre aux exigences de minutage de ces minuteurs.

Enfin, l’utilisation d’ExSetTimerResolution est intrinsèquement moins précise que l’utilisation d’un minuteur haute résolution. Une fois qu’un pilote appelle ExSetTimerResolution pour augmenter l’horloge système à son débit maximal, ce qui est généralement environ une graduation par milliseconde, le pilote peut appeler une routine telle que KeSetTimerEx pour définir le minuteur. Si, dans cet appel, le pilote spécifie une heure d’expiration relative, le minuteur peut expirer jusqu’à environ une milliseconde antérieure ou ultérieure à l’heure d’expiration spécifiée. Toutefois, si une heure d’expiration relative est spécifiée pour un minuteur à haute résolution, le minuteur peut expirer jusqu’à environ une milliseconde plus tard que l’heure d’expiration spécifiée, mais elle n’expire jamais tôt.