Разница между CLOCK_REALTIME и CLOCK_MONOTONIC? - PullRequest
171 голосов
/ 19 августа 2010

Не могли бы вы объяснить разницу между CLOCK_REALTIME и CLOCK_MONOTONIC часами, возвращаемыми clock_gettime() в Linux?

Что является лучшим выбором, если мне нужно вычислить истекшее время между временными метками, созданными внешним источникоми текущее время?

Наконец, если у меня есть демон NTP, периодически меняющий системное время, как эти настройки взаимодействуют с каждым из CLOCK_REALTIME и CLOCK_MONOTONIC?

Ответы [ 5 ]

202 голосов
/ 20 августа 2010

CLOCK_REALTIME представляет собой предположение машины о текущих настенных часах и времени суток.Как говорят Ignacio и MarkR , это означает, что CLOCK_REALTIME может прыгать вперед и назад при изменении системных часов, включая NTP.

CLOCK_MONOTONIC представляет абсолютное истекшее время настенных часов с некоторой произвольной фиксированной точки в прошлом.На него не влияют изменения системных часов времени.

Если вы хотите вычислить прошедшее время между двумя событиями, наблюдаемыми на одной машине без перезагрузки, лучше всего использовать CLOCK_MONOTONICoption.

Обратите внимание, что в Linux CLOCK_MONTONIC не измеряет время, потраченное на приостановку, хотя по определению POSIX это должно быть.Вы можете использовать специфичную для Linux CLOCK_BOOTTIME для монотонных часов, которые продолжают работать в режиме ожидания.

33 голосов
/ 16 июля 2013

Книга Роберта Лава Системное программирование LINUX, 2-е издание , специально посвящено вашему вопросу в начале главы 11, стр. 363:

Важным аспектом монотонного источника времени НЕ является текущий значение, но гарантия того, что источник времени строго линейно увеличивается, и, следовательно, полезно для расчета разницы во времени между двумя выборками

Тем не менее, я полагаю, что он предполагает, что процессы выполняются в одном и том же экземпляре ОС, поэтому вам может потребоваться периодическая калибровка для оценки дрейфа.

19 голосов
/ 19 августа 2010

CLOCK_REALTIME зависит от NTP и может двигаться вперед и назад. CLOCK_MONOTONIC нет, и прогрессирует на один тик за тик.

15 голосов
/ 19 августа 2010

В дополнение к ответ Игнасио , CLOCK_REALTIME может подниматься вперед скачком, а иногда и назад. CLOCK_MONOTONIC не делает ни того, ни другого; он просто продолжает двигаться вперед (хотя он, вероятно, сбрасывается при перезагрузке).

Надежное приложение должно быть в состоянии выдержать CLOCK_REALTIME время от времени скачкообразно (и, возможно, очень незначительно назад), хотя это скорее крайний случай).

Представьте себе, что происходит, когда вы приостанавливаете свой ноутбук - CLOCK_REALTIME скачет вперед после возобновления, CLOCK_MONOTONIC - нет. Попробуйте на ВМ.

7 голосов

POSIX 7 цитат

POSIX 7 указывает оба на http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html:

CLOCK_REALTIME

Эти часы представляют часы, измеряющие реальное время для системы. Для этих часов значения, возвращенные функцией clock_gettime () и заданные функцией clock_settime (), представляют количество времени (в секундах и наносекундах) с начала эпохи.

CLOCK_MONOTONIC (дополнительная функция):

Для этих часов значение, возвращаемое функцией clock_gettime (), представляет количество времени (в секундах и наносекундах) с неопределенной точки в прошлом (например, время запуска системы или эпоха). Эта точка не изменяется после запуска системы. Значение часов CLOCK_MONOTONIC не может быть установлено с помощью clock_settime ().

clock_settime() дает важный совет: системы POSIX могут произвольно изменять CLOCK_REALITME с ним, поэтому не полагайтесь на то, что он течет ни непрерывно, ни вперед. NTP может быть реализован с использованием clock_settime() и может влиять только на CLOCK_REALITME.

Кажется, что реализация ядра Linux требует времени загрузки как эпоха для CLOCK_MONOTONIC: Начальная точка для CLOCK_MONOTONIC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...