web-dev-qa-db-fra.com

Pourquoi CLOCK_TAI et CLOCK_REALTIME renvoient la même valeur?

Sur mon Ubuntu 15.04 (noyau Linux 3.19.0-28-generic), je reçois la même valeur lorsque je demande CLOCK_TAI et CLOCK_REALTIME avec clock_gettime(). C'est apparemment une erreur car la différence entre CLOCK_TAI et CLOCK_REALTIME devrait correspondre au nombre de secondes intercalaires plus la différence d'époque compte tenu de cet article à propos du système d'exploitation RedHat.

2
chmike
CLOCK_TAI is basically designed as CLOCK_REALTIME(UTC) + tai_offset.  

Ainsi, la partie usec/nsec d'un timeval/timespec devrait être identique.

CLOCK_MONOTONIC: Zeroed at boot.  

CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset    

CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset  

Mais pour des raisons de performances (CLOCK_REALTIME est ce que les applications martèlent le plus), sous Linux, nous le structurons comme suit:

CLOCK_REALTIME: Initialized at boot from RTC  
CLOCK_MONOTONIC: CLOCK_REALTIME - wall_to_monotonic  
CLOCK_TAI: CLOCK_REALTIME + tai_offset

Alors CLOCK_REALTIME and CLOCK_TAI return the same because the kernel parameter tai_offset is zero.

Vérifiez en utilisant adjtimex(timex tmx) et lisez la valeur. Je pense que ntpd le définira s'il est suffisamment nouveau (>4.2.6) et dispose d'un fichier de seconde intercalaire. Il peut également être en mesure de l'obtenir à partir de serveurs en amont, mais je n'ai pas pu vérifier. L'appel adjtimex() peut définir tai_offset manuellement lorsqu'il est exécuté en tant que root.

Mes références ici et ici

3
Ravan

La réponse a été trouvée à l'intérieur de l'article cité. L'accent est par moi.

Pour les applications où il serait possible de travailler avec l'heure TAI au lieu de l'heure UTC, le noyau fournit une horloge CLOCK_TAI spéciale qui inclut les secondes intercalaires et qu'il n'est pas nécessaire de corriger après une seconde intercalaire, ce qui évite le problème du saut en arrière dans le temps. . Il est implémenté comme une horloge fonctionnant avec un décalage intégral fixe par rapport à CLOCK_REALTIME, qui est incrémenté atomiquement de 1 lorsque l’horloge CLOCK_REALTIME est reculée de seconde en seconde. Il a été introduit dans la version 3.10 du noyau Linux et est disponible avec les noyaux fournis dans RHEL7. Veuillez noter que le décalage de CLOCK_REALTIME est initialisé au démarrage et que ni ntpd ni chronyd ne le définissent par défaut à la valeur correcte (actuellement 35). Le passage à CLOCK_TAI dans les applications ne nécessite bien sûr pas code et éventuellement aussi tous les protocoles qui utilisent la représentation du temps Unix.

1
chmike