Frage Warum CLOCK_TAI und CLOCK_REALTIME gibt den gleichen Wert zurück?


Auf meinem Ubuntu 15.04 (Linux Kernel 3.19.0-28-generic) bekomme ich bei der Anfrage den gleichen Wert CLOCK_TAI und CLOCK_REALTIME mit clock_gettime(). Dies ist anscheinend ein Fehler, weil der Unterschied zwischen CLOCK_TAIund CLOCK_REALTIME sollte die Anzahl der Schaltsekunden zuzüglich der Epochendifferenz sein Dieser Artikel über das RedHat OS.


2
2017-09-18 14:08


Ursprung




Antworten:


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

Daher sollte der usec / nsc-Teil eines timeval / timespec identisch sein.

CLOCK_MONOTONIC: Zeroed at boot.  

CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset    

CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset  

Aber wegen Performance-Bedenken (CLOCK_REALTIME ist welche Anwendungen hämmern am meisten), in Linux strukturieren wir es eigentlich als:

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

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

Überprüfen Sie mit adjtimex(timex tmx) und lies den Wert. ich denke, dass ntpd wird es einstellen, wenn es neu genug ist (>4.2.6) und hat eine Schaltsekunden-Datei. Es kann auch in der Lage sein, es von Upstream-Servern zu bekommen, aber ich konnte es nicht verifizieren. Der Anruf adjtimex() kann einstellen tai_offset manuell, wenn als root ausgeführt.

Meine Referenzen Hier und Hier


3
2017-09-18 15:08



Ausgezeichnetes Finden. Vielen Dank. Ich habe hier die gleiche Frage zum Stapelüberlauf gestellt stackoverflow.com/q/32652688/75517. Wenn Sie Ihre Antwort dorthin kopieren, gebe ich Ihnen die Antwort. In Bezug auf die Antwort in Ihrer zweiten Referenz stimme ich Stulz nicht zu. Es ist nicht das gleiche. Bei der Schaltsekunde ist ein Fehler aufgetreten. Wenn TAI verwendet wurde, würde die monotone Uhr nicht mehr benötigt werden. Um die REALTIME genau in die Gregorianische Zeit zu konvertieren, muss die Schaltsekunden-Tabelle verwendet werden. - chmike


Die Antwort wurde innerhalb des genannten Artikels gefunden. Der Schwerpunkt liegt bei mir.

Für Anwendungen, bei denen es möglich wäre, mit TAI-Zeit anstelle von UTC zu arbeiten, stellt der Kernel eine spezielle CLOCK_TAI-Uhr bereit, die Schaltsekunden enthält und nach der Schaltsekunde nicht korrigiert werden muss, um das Problem mit Rückwärtssprüngen zu vermeiden . Es wird als eine Uhr implementiert, die mit einem festen Integral-Offset zu CLOCK_REALTIME läuft, der atomar um 1 inkrementiert wird, wenn die CLOCK_REALTIME-Uhr auf die Schaltsekunde zurückgeschaltet wird. Es wurde in der Linux-Kernel-Version 3.10 eingeführt und ist mit den in RHEL7 ausgelieferten Kernel verfügbar. Bitte beachten Sie, dass der Offset von CLOCK_REALTIME beim Booten auf Null initialisiert wird und weder ntpd noch chronyd standardmäßig auf den korrekten Wert gesetzt wird (derzeit 35). Ein Wechsel zu CLOCK_TAI in Anwendungen würde natürlich Änderungen des Codes und möglicherweise auch aller Protokolle erfordern, die die Unix-Darstellung der Zeit verwenden.


1
2017-09-18 14:57