В чем разница между CLOCK_MONOTONIC и CLOCK_MONOTONIC_RAW?

В соответствии с линией Linux в разделе 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.

В соответствии с веб-браузером онлайн-словарь Monotonic означает:

2: обладающее свойством либо никогда не увеличиваться, либо никогда уменьшаясь как значения независимой переменной или индексов членов возрастает.

Другими словами, он не скатится назад. Я вижу, что это было бы важным свойством, если бы вы определяли некоторый код.

Однако разница между нормальной и необработанной версией неясна. Может ли кто-то пролить свет на то, как NTP может по-прежнему влиять на CLOCK_MONOTONIC?

Ответ 1

CLOCK_MONOTONIC никогда не испытывает разрывов из-за корректировки времени NTP, но он меняет частоту, поскольку NTP узнает, какая ошибка существует между локальным генератором и восходящими серверами.

CLOCK_MONOTONIC_RAW является просто локальным осциллятором, а не дисциплинированным NTP. Это может быть очень полезно, если вы хотите реализовать какой-то другой алгоритм синхронизации времени против часов, которые не сражаются с вами из-за NTP. Хотя ntpd (эталонная реализация протокола NTP и самый распространенный демон NTP) считается "нежным" с настройками времени, более точно сказать, что он нежен с абсолютным временем. Он готов убить часы на 500ppm, что довольно драматично, если вы можете измерить свою тактовую частоту по сравнению с другими стандартами.

Утилита CLOCK_MONOTONIC_RAW будет ограничена до тех пор, пока такие объекты, как pthread_timedwait_monotonic, не смогут использовать эту временную базу.

Ответ 2

ntpd не приводит к скачку времени, если разница ниже определенного порога. вместо этого используется корректировка с учетом времени, влияющая как на CLOCK_MONOTONIC, так и на CLOCK_REALTIME (но не на CLOCK_MONOTONIC_RAW, видимо).