Différence entre horloge en temps réel et horloge monotone?

pourriez-vous expliquer la différence entre CLOCK_REALTIME et CLOCK_MONOTONIC horloges retournées par clock_gettime() sur Linux?

Quel est le meilleur choix si je dois calculer le temps écoulé entre les horodateurs produits par une source externe et le temps actuel?

enfin, si j'ai un démon NTP réglant périodiquement le temps du système, comment ces réglages interagissent-ils avec chacun des CLOCK_REALTIME et CLOCK_MONOTONIC ?

151
demandé sur Aliaksandr Belik 2010-08-19 19:34:23

5 réponses

CLOCK_REALTIME représente la meilleure estimation de la machine quant à l'horloge murale actuelle, l'Heure de la journée. Comme Ignacio et MarkR dire, cela signifie que CLOCK_REALTIME peut sauter en avant et en arrière que l'horloge de l'Heure de jour du système est changé, y compris par NTP.

CLOCK_MONOTONIC représente le temps absolu écoulé de l'horloge murale depuis un point fixe arbitraire dans le passé. Il n'est pas affecté par des changements dans le système le temps de la journée de l'horloge.

si vous voulez calculer le temps écoulé entre deux événements observés sur une machine sans redémarrage intermédiaire, CLOCK_MONOTONIC est la meilleure option.

notez que sur Linux, CLOCK_MONTONIC ne mesure pas le temps passé en suspension, bien que par la définition POSIX il devrait. Vous pouvez utiliser le CLOCK_BOOTTIME spécifique à Linux pour une horloge monotone qui continue à fonctionner pendant la suspension.

179
répondu caf 2018-05-10 06:32:10

Robert Lover's book LINUX System Programming 2nd Edition , répond spécifiquement à votre question au début du Chapitre 11, pg 363:

l'aspect important d'une source de temps monotone N'est pas le courant valeur, mais aussi la garantie que la source de temps est strictement linéaire augmentation, et donc utile pour calculer la différence dans le temps entre deux échantillonnages

qui dit, Je pense qu'il suppose que les processus fonctionnent sur la même instance D'un OS, donc vous pourriez vouloir avoir un calibrage périodique en cours d'exécution pour être en mesure d'estimer la dérive.

28
répondu user2548100 2014-01-14 18:28:31

CLOCK_REALTIME est affecté par le NTP, et peut se déplacer vers l'avant et vers l'arrière. CLOCK_MONOTONIC n'est pas, et avance à une tique par tique.

16
répondu Ignacio Vazquez-Abrams 2010-08-19 15:37:51

en plus de réponse D'Ignacio , CLOCK_REALTIME peut monter en avant dans les sauts, et parfois en arrière. CLOCK_MONOTONIC ne fait ni l'un ni l'autre; il continue simplement à avancer (bien qu'il se réinitialise probablement au redémarrage).

une application robuste doit être capable de tolérer CLOCK_REALTIME sautant en avant de temps en temps (et peut-être en arrière très légèrement de temps en temps, bien que ce soit plus d'un cas de bord).

imaginez ce qui se passe lorsque vous suspendez votre ordinateur portable - CLOCK_REALTIME saute en avant suivant le curriculum vitae, CLOCK_MONOTONIC ne fait pas. Essayez-la sur une VM.

14
répondu MarkR 2017-05-23 11:54:54

POSIX 7 spécifie les deux à http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html :

CLOCK_REALTIME :

cette horloge représente l'horloge mesurant le temps réel pour le système. Pour cette horloge, les valeurs renvoyées par clock_gettime() et précisée par clock_settime() représente le temps (en secondes et nanosecondes) depuis l'Époque.

CLOCK_MONOTONIC (option):

pour cette horloge, la valeur retournée par clock_gettime() représente le temps (en secondes et nanosecondes) écoulé depuis un point non spécifié dans le passé (par exemple, le temps de démarrage du système, ou L'époque). Ce point ne change pas après l'Heure de démarrage du système. la valeur de L'horloge CLOCK_MONOTONIC ne peut pas être définie via clock_settime().

clock_settime() donne une indication importante: les systèmes POSIX sont capables de changer arbitrairement CLOCK_REALITME avec elle, donc ne vous fiez pas à ce qu'il coule ni en continu ni en avant. Le NTP pourrait être mis en œuvre en utilisant clock_settime() , et ne pourrait affecter que CLOCK_REALITME .

L'implémentation du noyau Linux semble prendre du temps de démarrage comme époque pour CLOCK_MONOTONIC : point de départ pour CLOCK_MONOTONIC

4