Précision du minuteur

Une routine de minuteur système permet généralement à l’appelant de spécifier une heure absolue ou une heure d’expiration relative pour un minuteur. Par exemple, consultez KeWaitForSingleObject, KeSetTimer ou KeDelayExecutionThread. La précision avec laquelle le système d’exploitation peut mesurer les temps d’expiration est limitée par la granularité de l’horloge système.

L’heure système est mise à jour à chaque coche de l’horloge système et n’est précise qu’à la dernière coche. Si l’appelant spécifie une heure d’expiration absolue, l’expiration du minuteur est détectée lors du traitement de la première horloge système qui se produit après l’heure spécifiée. Ainsi, le minuteur peut expirer jusqu’à une période d’horloge système postérieure à l’heure d’expiration absolue spécifiée. Si un intervalle du minuteur, ou heure d’expiration relative, est spécifié à la place, l’expiration peut se produire jusqu’à une période antérieure ou postérieure à l’heure spécifiée, en fonction de l’endroit où se situent exactement les heures de début et de fin de cet intervalle entre l’horloge système. Qu’une heure absolue ou relative soit spécifiée, il est possible que l’expiration du minuteur ne soit détectée que plus tard si le traitement d’interruption de l’horloge système est retardé par l’interruption du traitement pour d’autres appareils.

Lorsque l’appelant spécifie une heure d’expiration relative, la routine du minuteur ajoute l’heure d’horloge système actuelle à l’heure d’expiration relative spécifiée pour calculer l’heure d’expiration absolue à utiliser pour le minuteur. Étant donné que l’heure système n’est exacte qu’à la dernière graduation de l’horloge système, l’heure d’expiration calculée peut correspondre à une période d’horloge système antérieure à l’heure d’expiration attendue par l’appelant. Si une heure d’expiration relative spécifiée est proche ou inférieure à la période d’horloge système, le minuteur peut expirer immédiatement, sans délai.

Un moyen possible de prendre en charge plus précisément des délais d’expiration plus courts consiste à réduire le temps entre les temps d’horloge du système, mais cela risque d’augmenter la consommation d’énergie. En outre, la réduction de la période d’horloge système peut ne pas obtenir de façon fiable une précision plus fine de l’horloge système, sauf si l’interruption de traitement pour les autres appareils de la plateforme peut être garantie de ne pas retarder le traitement des interruptions d’horloge système.

À compter de Windows 8, KeDelayExecutionThread utilise une technique plus précise pour calculer l’heure d’expiration absolue à partir d’une heure d’expiration relative spécifiée par l’appelant. Tout d’abord, pour obtenir une estimation plus précise de l’heure système actuelle, la routine utilise le compteur de performances système pour mesurer le temps écoulé depuis la dernière horloge système. Ensuite, la routine ajoute cette estimation plus précise de l’heure système à l’heure d’expiration relative pour calculer le temps d’expiration absolu. Le temps d’expiration absolu calculé par cette technique est précis à une microseconde. Par conséquent, le minuteur n’expirera pas avant l’expiration relative spécifiée. Le minuteur peut toujours expirer jusqu’à une période d’horloge système postérieure à l’heure spécifiée, et peut expirer même plus tard si le traitement de l’interruption de l’horloge système est retardé par interruption de traitement pour d’autres appareils.

Si l’heure système change avant l’expiration d’un minuteur, un minuteur relatif n’est pas affecté, mais le système ajuste chaque minuterie absolue. Un minuteur relatif expire toujours après l’expiration du nombre spécifié d’unités de temps, quelle que soit l’heure système absolue. Un minuteur absolu expire à une heure système spécifique, donc une modification de l’heure système modifie la durée d’attente d’un minuteur absolu.