web-dev-qa-db-fra.com

Quelle est la différence entre CLOCK_MONOTONIC et CLOCK_MONOTONIC_RAW?

Selon la page de manuel Linux sous Ubuntu

CLOCK_MONOTONIC
      Clock that cannot be set and  represents  monotonic  time  since
      some unspecified starting point.

CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
      Similar  to  CLOCK_MONOTONIC, but provides access to a raw hard‐
      ware-based time that is not subject to NTP adjustments.

Selon le dictionnaire en ligne Webster, Monotonic signifie:

2: ayant la propriété de ne jamais augmenter ou de ne jamais diminuer à mesure que les valeurs de la variable indépendante ou les indices des termes augmentent.

En d'autres termes, il ne sautera pas en arrière. Je peux voir que ce serait une propriété importante si vous chronométriez du code.

Cependant, la différence entre la version normale et la version brute n'est pas claire. Quelqu'un peut-il nous expliquer comment NTP peut toujours affecter CLOCK_MONOTONIC?

33
Matt

CLOCK_MONOTONIC ne subit jamais de discontinuités en raison de NTP ajustements de temps, mais il fait change de fréquence comme NTP apprend quelle erreur existe entre le oscillateur local et les serveurs en amont.

CLOCK_MONOTONIC_RAW est simplement l'oscillateur local, non discipliné par NTP. Cela pourrait être très utile si vous souhaitez implémenter un autre algorithme de synchronisation horaire contre une horloge qui ne vous combat pas en raison de NTP. Alors que ntpd (l'implémentation de référence du protocole NTP et le démon NTP) le plus répandu) est réputé être "doux" avec les ajustements de temps, il est plus précis de dire il est doux avec le temps absolu. Il est prêt à faire tourner l'horloge de 500 ppm, ce qui est assez dramatique si vous êtes en mesure de mesurer votre fréquence d'horloge par rapport à une autre norme.

L'utilité de CLOCK_MONOTONIC_RAW va être limité jusqu'à ce que des installations comme pthread_timedwait_monotonic offre une option pour utiliser cette base de temps.

30
Ben Jackson

ntpd n'entraîne pas le temps à jump si la différence est inférieure à un certain seuil. un ajustement de type adjtime est utilisé à la place, affectant à la fois CLOCK_MONOTONIC et CLOCK_REALTIME (mais non CLOCK_MONOTONIC_RAW, Apparemment).

2
Anton Kovalenko