CLOCK_REALTIME
stellt die beste Vermutung der Maschine hinsichtlich der aktuellen Wanduhr und Tageszeit dar. Wie Ignacio und MarkR sagen, bedeutet dies, dass CLOCK_REALTIME
vorwärts und rückwärts gesprungen werden kann, wenn die Uhrzeit des Systems geändert wird, auch durch NTP.
CLOCK_MONOTONIC
repräsentiert die absolut verstrichene Wanduhrzeit seit einem beliebigen festen Punkt in der Vergangenheit. Es ist nicht von Änderungen der Systemzeituhr betroffen.
Wenn Sie die verstrichene Zeit zwischen zwei auf einem Computer beobachteten Ereignissen ohne einen dazwischen liegenden Neustart berechnen möchten, CLOCK_MONOTONIC
ist dies die beste Option.
Beachten Sie, dass unter Linux CLOCK_MONOTONIC
die in Suspend verbrachte Zeit nicht gemessen wird, obwohl dies nach der POSIX-Definition der Fall sein sollte. Sie können Linux-spezifisch CLOCK_BOOTTIME
für eine monotone Uhr verwenden, die während des Suspendierens weiterläuft.
CLOCK_MONOTONIC
in diesem Szenario die beste Wahl? zB Patriot Missile SystemDas Buch LINUX System Programming 2nd Edition von Robert Love befasst sich speziell mit Ihrer Frage zu Beginn von Kapitel 11, S. 363:
Ich glaube jedoch, dass er davon ausgeht, dass die Prozesse auf derselben Instanz eines Betriebssystems ausgeführt werden. Daher möchten Sie möglicherweise eine regelmäßige Kalibrierung durchführen, um die Drift abschätzen zu können.
quelle
CLOCK_REALTIME
ist von NTP betroffen und kann sich vorwärts und rückwärts bewegen.CLOCK_MONOTONIC
ist nicht und rückt mit einem Tick pro Tick vor.quelle
System.nanoTime()
verwendetCLOCK_MONOTONIC
und kann eine Dauer von 1000 ns oder weniger messen . Vielleicht denken Sie über die Systemzeit nach, die manchmal auf Millisekunden beschränkt ist?Neben Ignacio Antwort ,
CLOCK_REALTIME
kann in den Sprüngen nach oben vorwärts und rückwärts hin und wieder.CLOCK_MONOTONIC
tut beides nicht; es geht einfach weiter vorwärts (obwohl es wahrscheinlich beim Neustart zurückgesetzt wird).Eine robuste App muss tolerieren können
CLOCK_REALTIME
gelegentlich vorwärts springen (und möglicherweise gelegentlich sehr leicht rückwärts, obwohl dies eher ein Randfall ist).Stellen Sie sich vor, was passiert, wenn Sie Ihren Laptop anhalten -
CLOCK_REALTIME
springt nach dem Lebenslauf vorwärts,CLOCK_MONOTONIC
nicht. Probieren Sie es auf einer VM aus.quelle
CLOCK_PROCESS_CPUTIME_ID
. Schnelltest:$ perl -w -MTime::HiRes=clock_gettime,CLOCK_MONOTONIC -E 'say clock_gettime(CLOCK_MONOTONIC)'
-> 706724.117565279. Diese Zahl entspricht der Systemverfügbarkeit unter Linux, aber der Standard sagt, dass dies willkürlich ist.CLOCK_MONOTONIC
ein Suspend / Resume angehalten wird, POSIX-konform ist. Es sollte die Zeit seit einem festen Punkt in der Vergangenheit sein, aber das Stoppen der Uhr über Suspend / Resume bricht das.POSIX 7 Anführungszeichen
POSIX 7 spezifiziert beide unter http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html :
CLOCK_REALTIME
::CLOCK_MONOTONIC
(optionale Funktion):clock_settime()
gibt einen wichtigen Hinweis: POSIX-Systeme können sich damit willkürlich ändern, verlassenCLOCK_REALITME
Sie sich also nicht darauf, dass es weder kontinuierlich noch vorwärts fließt. NTP konnte mithilfe von implementiert werdenclock_settime()
und nur Auswirkungen habenCLOCK_REALITME
.Die Implementierung des Linux-Kernels scheint die Startzeit als Epoche für Folgendes zu benötigen
CLOCK_MONOTONIC
: Startpunkt für CLOCK_MONOTONICquelle
Entschuldigung, kein Ruf, dies als Kommentar hinzuzufügen. Es geht also um eine ergänzende Antwort.
Je nachdem, wie oft Sie anrufen
clock_gettime()
, sollten Sie berücksichtigen, dass nur einige der "Uhren" von Linux im VDSO bereitgestellt werden (dh Sie benötigen keinen Systemaufruf mit dem gesamten Overhead von einem - was sich nur verschlimmerte, wenn Linux hinzugefügt wurde die Abwehrkräfte zum Schutz vor Spectre-ähnlichen Angriffen).Während
clock_gettime(CLOCK_MONOTONIC,...)
,clock_gettime(CLOCK_REALTIME,...)
undgettimeofday()
sind immer extrem schnell sein würde (durch die VDSO beschleunigt), dann ist dies nicht für z. B. CLOCK_MONOTONIC_RAW oder eine der anderen POSIX-Uhren.Dies kann sich mit der Kernelversion und der Architektur ändern.
Obwohl die meisten Programme dies nicht beachten müssen, kann es zu Latenzspitzen bei Uhren kommen, die vom VDSO beschleunigt werden: Wenn Sie sie direkt treffen, wenn der Kernel den gemeinsam genutzten Speicherbereich mit den Uhrzählern aktualisiert, muss er auf die warten Kernel zu beenden.
Hier ist der "Beweis" (GitHub, um Bots von kernel.org fernzuhalten): https://github.com/torvalds/linux/commit/2aae950b21e4bc789d1fc6668faf67e8748300b7
quelle