242 votes

Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC?

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

Quel est le meilleur choix si je dois calculer le temps écoulé entre les horodatages produits par une source externe et l'heure actuelle?

Enfin, si j’ai un démon NTP qui ajuste périodiquement l’heure du système, comment ces ajustements interagissent-ils entre CLOCK_REALTIME et CLOCK_MONOTONIC ?

280voto

caf Points 114951

CLOCK_REALTIME représente la machine la mieux deviner le courant murale-horloge, l'heure de la journée. Comme Ignacio et MarkR dire, cela signifie qu' CLOCK_REALTIME pouvez sauter en avant et en arrière tant que le système de l'heure de l'horloge est modifiée, y compris par le NTP.

CLOCK_MONOTONIC représente l'absolu écoulé horloge murale depuis quelques arbitraire, point fixe dans le passé. Il n'est pas affecté par des changements dans le système de l'heure de l'horloge.

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

43voto

user2548100 Points 610

Robert l'Amour du livre LINUX Système de Programmation de la 2e Édition, répond spécifiquement à votre question, au début du Chapitre 11, page 363:

L'aspect important d'un monotone source de temps n'est PAS au courant valeur, mais aussi la garantie que la source de temps est strictement linéaire d'augmenter, et donc utile pour le calcul de la différence dans le temps entre deux échantillonnages

Cela dit, je crois qu'il est en supposant que le processus en cours d'exécution sur la même instance de l'OS, de sorte que vous pouvez avoir un étalonnage périodique en cours d'exécution pour être en mesure d'estimer la dérive.

31voto

CLOCK_REALTIME est affecté par NTP et peut avancer ou reculer. CLOCK_MONOTONIC n'est pas, et avance d'un tick par tick.

20voto

MarkR Points 37178

En plus de Ignacio de la réponse, CLOCK_REALTIME pouvez aller de l'avant dans les sauts, et parfois à l'envers. CLOCK_MONOTONIC ne fait rien; simplement, il continue à aller de l'avant (même s'il est probablement réinitialise à chaque redémarrage).

Un robuste application doit être en mesure de tolérer CLOCK_REALTIME bondissant transmet à l'occasion (et peut-être en arrière très légèrement très de temps en temps, même si c'est plus d'un bord-cas).

Imaginez ce qui se passe lorsque vous suspendez votre ordinateur portable - CLOCK_REALTIME sauts transmet à la suite de la reprise, CLOCK_MONOTONIC ne le sont pas. Essayez-la sur une VM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X