Frage

Wenn Sie einen Blick auf die clock_gettime () Funktion, die in allen BSDs verfügbar ist und ist eigentlich als Teil des POSIX-Standard definiert ist, sehen Sie, dass es Unterstützung für mindestens drei Arten von Uhren (viele Systeme unterstützen mehr als diese Uhren ist, aber eigentlich der POSIX-Standard verlangt, nur eine bis anwesend sein, alle anderen sind optional):

  • CLOCK_REALTIME - POSIX verlangt dies anwesend zu sein. Dies ist die Wand Zeituhr.

  • CLOCK_MONOTONIC -. Keine Ahnung, was das ist (und was SI Sekunden bedeuten), aber ich verstehe, dass diese Uhr nie rückwärts springen, kann es nur monoton im Wert steigen

  • CLOCK_UPTIME - Ich verstehe nicht, wie dies zu CLOCK_MONOTONIC unterschiedlich ist (Uptime auch nie springt rückwärts), aber zumindest ich weiß, dass diese Uhr bei Null beginnt, wenn der Kernel bootet (während es ist nicht definiert, welcher Anfangswert CLOCK_MONOTONIC haben wird, wenn der Kernel bootet)

Lassen Sie uns die anderen Uhren für eine zweite ignorieren. CLOCK_REALTIME garantiert nicht monoton aufwärts zu zählen, nicht wahr? Dies ist die eigentliche „Systemzeit“. Ich kann die Systemzeit nach Belieben ändern. Ich kann es 3 Monate in die Vergangenheit oder 5 Jahre in die Zukunft gesetzt und jedes Mal, wenn mein System synchronisiert Zeit, um einen NTP-Server im Netz verwendet, kann die Zeit springt vorwärts oder rückwärts.

Jetzt haben wir zwei Schlaf Funktionen in einem BSD-System. sleep () und nanosleep () . Ich bin nicht sicher, aber ich würde erwarten, sleep () auf der Nanosleep umgesetzt werden, schließlich kann ich leicht emulieren sleep () unter Verwendung von nanosleep () und nur die Anzahl der Sekunden in der Struktur timespec gesetzt, hält ns Null .

ich bei vielen Quellen gelesen habe, dass diese Funktionen tatsächlich funktionieren, indem die Aufwachzeit Berechnung (aktuelle Zeit bekommen, schlafen Menge, um es hinzuzufügen) und das System wird dann in regelmäßigen Abständen überprüfen, ob die aktuelle Zeit später als die Aufwachzeit und wenn ja, wird er den Faden wieder aufwachen. Die Tatsache, dass dies nur in Abständen überprüft wird, ist der Grund, warum die Menschen Seiten sagen, dass der aktuelle Schlaf für mindestens diese Zeit schlafen (kürzer nur durch ein Signal unterbrochen, wenn), aber es kann länger schlafen (je nachdem, wie oft prüft das System, wenn wir bereits über die Aufwachzeit und je nachdem, wie lange es dauert, bis die Planer dieses Thema wieder laufen zu lassen).

Das ist alles völlig gesund zu mir ... aber es ist eine Frage, die mich immer abgehört:

Nach verschiedenen Quellen der Betten (zumindest die Nanosleep) intern CLOCK_REALTIME als Uhr verwenden. Das bedeutet, wenn tell nanosleep () für 30 Sekunden schlafen, dann meine Systemuhr in Zukunft bis 1 Stunde ändern, wird der Faden fast sofort aufwacht (1 Stunde in der Zukunft liegt weit vor der Aufwachzeit Nanosleep ( ) berechnet). Das ist auch vollkommen in Ordnung. Doch , was passiert, wenn ich wake in 30 Sekunden sagen, und dann der Benutzer herausfindet, dass seine Systemuhr eine Stunde voraus ist und setzt seine Uhr nach hinten um eine Stunde? Dann wird mein Thread für 1 Stunde schlafen und 30 Sekunden? Wie das wäre eher schlecht sein.

War es hilfreich?

Lösung

Soweit ich weiß, Schlaf-Funktionen sind in der Regel eher wie ein Abwärtszähler implementiert. Sie sagen: „Schlaf für 10 Sekunden“, die „für 1000 Zeitplan Zecken Schlaf“ im Scheduler in übersetzt, und dann jedes Mal, wenn die Planer Kontrollen Schlaf verarbeitet es verringert die Menge an Zeit.

Auf diese Weise wird die Ruhezeit immer eine Menge an Echtzeit sein, zu schlafen, da erst einige Zeit in der Zukunft zu schlafen gegenüber. Der Grund dafür ist, wie Sie vermutet haben, wenn wir eine Zeit in der Zukunft holen wir nie erreichen könnten (oder möglicherweise in einer unerwarteten Menge an Zeit bekommen dort). Dies steht im Einklang mit dem, was Sie wollen, würden in einem Programm Schlaf verwenden. Es ist nicht dazu gedacht, Kalender-ähnliche Berechnungen zu tun.

Sie können auch einen einfachen Test machen, ein Programm Schlaf für 30 Sekunden machen, die nichts „Zeit“ Befehl zu Zeit, wie lange die Funktion ausgeführt wird, und nach dem Start der Systemuhr zurück 5 Minuten ändern und sehen, was passiert.

Andere Tipps

Der Faden wird auf einem internen Zähler überprüft werden, die auf die Dauer des Schlafes nicht bis zum Endpunkt des Schlafes eingestellt ist. Der interne Zähler verwendet wird, hat nichts mit der aktuellen Systemzeit zu tun und wird daher nicht beeinträchtigt werden, wenn Änderungen in der Systemzeit auftreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top