2017-01-27 2 views
4

ich über den Unterschied zwischen CLOCK_REALTIME und CLOCK_MONOTONIC leseWas nutzt CLOCK_REALTIME?

Difference between CLOCK_REALTIME and CLOCK_MONOTONIC?

Die CLOCK_REALTIME hat Diskontinuitäten in der Zeit, nach vorn wie nach hinten als auch springen kann: ist, dass ein Fehler in dieser Uhr? Wie könnte eine Uhr, die inkonsistente Zeit gibt, zuverlässig sein?

+2

Die Sommerzeit ist ein Beispiel für die Wanduhrzeit, die vorwärts und rückwärts springen kann. Beachten Sie auch, dass in dieser Antwort eindeutig angegeben wird, dass es sich um die Schätzung des Systems handelt * - und wenn festgestellt wird, dass eine vorherige Schätzung deaktiviert wurde, wird erneut geschätzt. – usr2564301

+0

Was bedeutet eine Vermutung? Das System schätzt die Zeit = bestimmt die Zeit mit einigen Fehlernummern – Bionix1441

+1

Hängt davon ab, wozu du es brauchst und was du damit vorhast, manchmal ist es nützlich, einen Zeitstempel zu haben (denke Logging), oder vielleicht möchtest du einen Zeitstempel erstellen einige Objekte (Erstellung, Abschluss der Transaktion etc.) Wo es sinnvoll ist, die Zeit von etwas zu kennen. HINWEIS: Dies bedeutet in keiner Weise Eignung für die Leistungsmessung ... – Nim

Antwort

9

Trotz seiner Unvollkommenheiten sollte CLOCK_REALTIME die beste Schätzung des Systems für die aktuelle UTC- oder Zivilzeit sein. Es ist die Grundlage für die Fähigkeit des Systems, die gleiche Zeit anzuzeigen, die Sie sehen würden, wenn Sie auf Ihre Uhr oder eine Uhr an der Wand oder auf Ihr Mobiltelefon schauten oder eine Sendung auf einer Radiostation usw. hörten Display hat eine Umwandlung von UTC in Ortszeit einzubeziehen; dazu später mehr)

Aber wenn CLOCK_REALTIME die UTC-Zeit wird in der realen Welt gibt es passen, gibt es mindestens zwei ziemlich wichtige Themen.

  1. Was passiert, wenn jemand versehentlich die Uhr auf Ihrem Computer falsch einstellt? Sie werden es reparieren müssen, und die Reparatur könnte einen Zeitsprung beinhalten. Es gibt so gut wie keinen Weg, besonders wenn der Fehler groß ist (wie Stunden oder Tage).
  2. Die meisten Computer haben leider keine Möglichkeit, Schaltsekunden darzustellen. Wenn also in der realen Welt ein Schaltsekundensprung auftritt, müssen die meisten Computeruhren ein wenig springen.

Also, wenn Sie diesen CLOCK_REALTIME lesen Diskontinuitäten haben könnte, könnte genauso nach hinten nach vorne als auch springen, das ist kein Fehler, es ist ein Merkmal: CLOCK_REALTIME muss diese Möglichkeiten haben, wenn es mit der realen Welt zu bewältigen ist mit Schaltsekunden und gelegentlich falsche Uhren.

Also, wenn Sie Code schreiben, der mit Zeiten arbeiten soll, die denen in der realen Welt entsprechen, ist CLOCK_REALTIME was Sie wollen, Warzen und alle. Idealerweise schreiben Sie Ihren Code jedoch so, dass er sich einigermaßen elegant verhält (nicht abstürzt oder etwas Bizarres tut), wenn die Uhr aus irgendeinem Grund ab und zu springt.

Wie Sie wahrscheinlich von der anderen Frage wissen Sie verwiesen wird CLOCK_MONOTONIC garantiert immer nach vorne einer Sekunde bei genau pro Sekunde Schritt, ohne Sprünge oder Diskontinuitäten, aber der absolute Wert der Uhr nicht viel bedeutet. Wenn der CLOCK_MONOTONIC-Wert 13:05 ist, bedeutet das nicht, dass es nach 1 Uhr nachmittags ist. Dies bedeutet normalerweise, dass der Computer 13 Stunden und 5 Minuten lang ausgeführt wurde.

Wenn Sie nur an relativen Zeiten interessiert sind, ist CLOCK_MONOTONIC in Ordnung. Insbesondere wenn Sie die Zeit, die etwas benötigt hat, zeitlich messen möchten, sollten Sie zwei CLOCK_MONOTONIC-Werte nehmen und sie subtrahieren, da Sie keine falsche Antwort erhalten, wenn es einen Zeitsprung (der CLOCK_REALTIME beeinflusst hätte) in zwischen.

Oder, zusammenfassend, wie die Leute im Kommentarfaden sagten, CLOCK_REALTIME ist das, was Sie für die absolute Zeit brauchen, während CLOCK_MONOTONIC für die relative Zeit besser ist.

Jetzt noch ein paar Punkte.

Wie erwähnt, CLOCK_REALTIME ist nicht ganz "Wandzeit", weil es tatsächlich in UTC handelt. Es verwendet die berühmte (berüchtigte?) Unix/Posix-Repräsentation von Sekunden seit 1970. Zum Beispiel, ein CLOCK_REALTIME-Wert von 1457852399 übersetzt um 06:59:59 UTC am 13. März 2016.Wo ich lebe, fünf Stunden westlich von Greenwich, heißt das um 01:59:59 Ortszeit. Aber eine Sekunde später, entspricht das 1457852400 03:00:00, weil die Sommerzeit eintritt.

Ich schlug vor, dass, wenn Ihre Uhr falsch war, ein Zeitsprung war so ziemlich die einzige Möglichkeit, es zu beheben, aber das ist nicht ziemlich wahr. Wenn Ihre Uhr nur geringfügig aus ist, können Sie sie korrigieren, indem Sie die Zeit schrittweise (durch geringfügige Änderung der Taktfrequenz) "schwenken", so dass sie nach ein paar Minuten oder Stunden ohne Sprung in die richtige Zeit verschoben ist. Das ist es, was NTP versucht, obwohl es abhängig von seiner Konfiguration nur bereit ist, das für Fehler zu tun, die ziemlich klein sind.

Ich sagte, dass CLOCK_MONOTONIC war in der Regel die Zeit, die der Computer ausgeführt wurde. Das ist nicht durch den Standard garantiert; Der Standard besagt, dass CLOCK_MONOTONIC die Zeit seit einem beliebigen Zeitpunkt zählt. Auf Systemen, die CLOCK_MONOTONIC als Zeitpunkt implementieren, an dem das System hochgefahren wurde, kann es zwei Interpretationen geben: Zeit seit dem Start oder die Zeit, zu der das System in Betrieb war (dh minus jede Zeit, in der es eingeschlafen oder ausgesetzt war) ? Auf vielen Systemen gibt es noch eine weitere Uhr CLOCK_BOOTTIME, die die Zeit seit dem Hochfahren zählt (ob aktiviert oder deaktiviert), während CLOCK_MONOTONIC nur dann zählt, wenn das System in Betrieb war.

Endlich, wenn Sie wollen, Uhrzeit, aber Sie wollen Sprünge oder Diskontinuitäten in Schaltsekunden zu vermeiden, haben Sie ein Problem, wegen der schlechten Handhabung von Schaltsekunden in traditionellen Unix/Linux (und Windows und alle andere) Computersysteme. Unter den letzten (4.x?) Linux-Kernel gibt es einen CLOCK_TAI, der helfen kann. Einige experimentelle Systeme können eine weitere Uhr, CLOCK_UTC, implementieren, die Schaltsekunden richtig handhabt. Beide haben andere Kosten, und Sie müssen wirklich wissen, was Sie getan haben, um sie effektiv zu nutzen, zumindest mit dem heutigen Niveau der Unterstützung. Weitere Informationen finden Sie unter LEAPSECS mailing list.

+2

Hervorragende Antwort. Deckt alle Basen auf einfache Weise ab. –

+0

_ "Das ist, was NTP versucht zu tun, obwohl es sich herausstellt, dass es nur für Fehler, die ziemlich klein sind (wie, weniger als eine Sekunde, denke ich)." _ Das ist völlig konfigurierbar in Ihrem NTP-Client –

+0

@LightnessRacesinOrbit Das hängt von deinem NTP-Client ab, denke ich. Ich habe aus gutem Grund, dass die Referenzimplementierung nur dann schwächer wird, wenn der Fehler weniger als 128 Millisekunden beträgt und es keine Möglichkeit gibt, diesen Wert neu zu konfigurieren. –