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
?
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.
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.
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.
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.
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