minuteurs High-Resolution
À compter de Windows 8.1, les pilotes peuvent utiliser les routines du minuteur ExXxx 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 qui sont 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 des interruptions d’horloge système pour qu’elles se produisent à un rythme plus élevé, ce qui tend à 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, de sorte que les heures auxquelles le minuteur expire plus précisément correspondent aux heures d’expiration nominales spécifiées dans les paramètres DueTime et Period .
Un pilote KMDF (Kernel-Mode Driver Framework) peut appeler la méthode WdfTimerCreate pour créer un minuteur haute résolution. Dans cet appel, le pilote passe un pointeur vers 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 à partir de Windows 8.1 et KMDF version 1.13.
Contrôle de la précision du minuteur
Par exemple, pour Windows exécuté sur un processeur x86, l’intervalle par défaut entre les cycles de l’horloge système est généralement d’environ 15 millisecondes, et l’intervalle minimal entre les cycles de l’horloge système est d’environ 1 milliseconde. Ainsi, le temps d’expiration d’un minuteur de résolution par défaut (créé par ExAllocateTimer si l’indicateur de EX_TIMER_HIGH_RESOLUTION n’est pas défini) ne peut être contrôlé que sur environ 15 millisecondes, mais le temps d’expiration d’un minuteur haute résolution peut être contrôlé à moins d’une milliseconde.
Si un pilote spécifie un délai d’expiration relatif pour un minuteur de résolution par défaut, le minuteur peut expirer jusqu’à environ 15 millisecondes avant ou après l’heure d’expiration spécifiée. Si un pilote spécifie un délai d’expiration relatif pour un minuteur haute résolution, le minuteur peut expirer jusqu’à environ une milliseconde après l’heure d’expiration spécifiée, mais il n’expire jamais plus tôt. Pour plus d’informations sur la relation entre la résolution d’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 à sa vitesse 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 à sa vitesse maximale pendant au moins une partie du temps avant l’expiration de ces minuteurs.
Pour éviter d’augmenter inutilement la consommation d’énergie, le système d’exploitation exécute l’horloge système à sa vitesse maximale uniquement lorsque cela est 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 à sa vitesse maximale 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 minuteur, l’horloge système s’exécute à sa vitesse par défaut.
Pour éviter une consommation excessive d’énergie, les pilotes doivent éviter de définir la période d’un minuteur à haute résolution de longue durée sur une valeur inférieure à l’intervalle par défaut entre les cycles de l’horloge système. Sinon, le système d’exploitation est obligé d’exécuter en continu l’horloge système à sa vitesse maximale.
À compter de Windows 8, un pilote peut appeler la routine ExQueryTimerResolution pour obtenir la plage de résolutions du minuteur prises en charge par l’horloge système.
Comparaison avec ExSetTimerResolution
À compter de Windows 2000, 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 changer l’horloge système de sa vitesse par défaut à sa vitesse maximale afin d’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 la fréquence d’horloge système, un pilote doit appeler ExSetTimerResolution une deuxième fois pour restaurer l’horloge système à sa vitesse 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 d’énergie excessive.
Deuxièmement, un pilote qui utilise la routine ExSetTimerResolution ne peut pas optimiser son utilisation temporaire de fréquences d’horloge système plus élevées aussi efficacement que le système d’exploitation pour les minuteurs à haute résolution. Ainsi, l’horloge système passe plus de temps à fonctionner à la vitesse maximale que ce qui est strictement 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 à sa vitesse maximale pendant de longues périodes. En revanche, le système d’exploitation coordonne globalement le fonctionnement de plusieurs minuteurs haute résolution afin que l’horloge système s’exécute à la vitesse maximale uniquement lorsque cela est 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. Après qu’un pilote a appelé ExSetTimerResolution pour augmenter la fréquence maximale de l’horloge système, qui est généralement d’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 avant ou après l’heure d’expiration spécifiée. Toutefois, si un délai d’expiration relatif est spécifié 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 plus tôt.