2011-02-09 3 views
6

Если я получаю время с помощью clock_gettime (CLOCK_MONOTONIC, x), тогда вызывается доход (например, sched_yield()), а затем снова получите время CLOCK_MONOTONIC, будет ли разница во времени включать время, в течение которого программа не выполнялась (при условии) , или CLOCK_MONOTONIC отслеживает только время выполнения программы? Мои тесты, похоже, подразумевают последнее, но я хотел бы точно знать.Является ли CLOCK_MONOTONIC процессом (или потоком) конкретным?

Кроме того, если CLOCK_MONOTONIC не включает указанное время, существует ли еще один монотонный таймер (т. Е. Один не подвержен скачкам, вызванным ntp)?

ответ

8

Ответ Maxim и комментарии к этому ответили на вторую часть вашего вопроса, я считаю. Для того, чтобы расширить ответ на первую часть, POSIX 2008 заявляет

If the Monotonic Clock option is supported, all implementations shall support a clock_id of CLOCK_MONOTONIC defined in <time.h>. This clock represents the monotonic clock for the system. For this clock, the value returned by clock_gettime() represents the amount of time (in seconds and nanoseconds) since an unspecified point in the past (for example, system start-up time, or the Epoch). This point does not change after system start-up time.

В частности, обратите внимание, «монотонные часы для системы». То есть, для каждой системы, а не для процесса, она продолжает тикать, даже если ваш процесс не запущен. Кроме того, «Эта точка не изменяется после времени запуска системы», что опять же означает, что она продолжает тикать независимо от того, работает ли какой-либо конкретный процесс или спят.

Итак, вы обнаружили ошибку в реализации Linux или, скорее всего, в своей тестовой программе.

4

Единственная разница между CLOCK_REALTIME и CLOCK_MONOTONIC заключается в том, что последнее невозможно установить. Эти часы тикают, даже когда ваш процесс не запущен.

http://www.opengroup.org/onlinepubs/009604599/functions/clock_getres.html

Обратите внимание, что абсолютная величина монотонного часов не имеет смысла (потому что его происхождение произвольно), и, таким образом, нет необходимости устанавливать его. Кроме того, приложения реального времени могут полагаться на то, что значение этих часов никогда не устанавливается, и поэтому интервалы времени, измеренные с помощью этих часов, не будут затронуты вызовами clock_settime().

В Linux удивительно, что CLOCK_MONOTONIC по-прежнему зависит от настроек NTP, чтобы он мог вернуться назад. Следовательно, они добавили еще один тактовый CLOCK_MONOTONIC_RAW:

люди clock_gettime

CLOCK_MONOTONIC_RAW (с Linux 2.6.28; Linux-специфический) Подобно CLOCK_MONOTONIC, но обеспечивает доступ к сырому времени аппаратного, который не подлежит NTP.

+3

Я считаю, что упомянутые корректировки NTP относятся к * скорости * продвижения часов, а не к прыжкам ('CLOCK_MONOTONIC' не будет пропустить назад). Обратите внимание, что 'CLOCK_MONOTONIC' останавливается, когда машина приостановлена, если это имеет значение. – caf

+3

Нет, CLOCK_MONOTONIC не возвращается в Linux. NTP настраивает время путем изменения шага только в том случае, если он выключен более чем на 1/2 секунды, это не влияет на монотонные часы. Для небольших настроек NTP настраивает часы во времени, слегка меняя тактовую частоту тактового сигнала, и CLOCK_MONOTONIC влияет на это. Но ставка тика никогда не будет отрицательной. – janneb

+0

Это не совсем ответит на мой вопрос: я знаю, что он останавливается, пока машина приостановлена, но останавливается ли она при приостановке _process_? – Benubird

Смежные вопросы