Имеют ли CLOCK_MONOTONIC и CLOCK_MONOTONIC_COARSE одну и ту же базу? - PullRequest
1 голос
/ 01 октября 2019

Страница man для clock_gettime() описывает CLOCK_MONOTONIC_COARSE как:

Более быстрая, но менее точная версия CLOCK_MONOTONIC. Используйте, когда вам нужны очень быстрые, но не мелкозернистые метки времени.

Что значит для одного быть «версией» другого?

Могу ли я достоверно сравнить одно с другим, предполагая, что я усекаю значение CLOCK_MONOTONIC с той же точностью, что и грубое?

1 Ответ

2 голосов
/ 01 октября 2019

Вот справочная страница, на которой перечислены различные «версии» часов Posix / Linux:

https://linux.die.net/man/2/clock_gettime

Достаточно свежие версии glibc и ядра Linux поддерживаютследующие часы:

  • CLOCK_REALTIME

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

  • CLOCK_REALTIME_COARSE (начиная с Linux 2.6.32; для Linux)

    Более быстрая, но менее точная версия CLOCK_REALTIME. Используйте, когда вам нужны очень быстрые, но не мелкие временные метки.

  • CLOCK_MONOTONIC

    Часы, которые не могут быть установлены и представляют монотонное время с некоторой неопределенной начальной точки. На эти часы не влияют скачкообразные скачки системного времени (например, если системный администратор вручную изменяет часы), но на них влияют инкрементные настройки, выполняемые adjtime (3) и NTP.

  • CLOCK_MONOTONIC_COARSE (начиная с Linux 2.6.32; для Linux)

    Более быстрая, но менее точная версия CLOCK_MONOTONIC. Используйте, когда вам нужны очень быстрые, но не мелкие временные метки.

  • CLOCK_MONOTONIC_RAW (начиная с Linux 2.6.28; для Linux) Аналогично CLOCK_MONOTONIC, но обеспечивает доступ к необработанному аппаратному времени, которое не подлежит настройкам NTP или выполненным инкрементным корректировкампо времени (3).

  • CLOCK_BOOTTIME (начиная с Linux 2.6.39; для Linux) Идентичен CLOCK_MONOTONIC, за исключением того, что он также включает в себя любое время, когда система приостановлена. Это позволяет приложениям получать монотонные часы с поддержкой приостановки, не имея дело со сложностями CLOCK_REALTIME, которые могут иметь разрывы, если время изменяется с помощью settimeofday (2).

  • CLOCK_PROCESS_CPUTIME_ID Таймер высокого разрешения для каждого процесса от ЦПУ.

  • CLOCK_THREAD_CPUTIME_ID Специфичные для потока часы времени процессора.

Как вы можете видеть выше, CLOCK_MONOTONIC_COARSE был представлен в Linux 2.6.32,Вот обоснование (и конкретный патч источника):

https://lwn.net/Articles/347811/

после разговора с некоторыми авторами приложений, которые хотят очень быстрых, но не детализированных временных меток, я решилчтобы попытаться реализовать новые clock_ids для clock_gettime (): CLOCK_REALTIME_COARSE и CLOCK_MONOTONIC_COARSE, которая возвращает время на последнем тике. Это очень быстро, так как нам не нужно обращаться к какому-либо оборудованию (что может быть очень болезненно, если вы используете что-то вроде acpi_pm clocksource), и мы можем даже использовать метод vdso clock_gettime (), чтобы избежать syscall. Единственным компромиссом является то, что вы получаете только разрешение в тиках с низким разрешением.

Это не новая идея, я знаю, что у Ingo есть патч в дереве -rt, который сделал vsyscall gettimeofday () return грубымвремя, когда для параметра ssctrl vsyscall64 было установлено значение 2. Однако это влияет на все приложения в системе.

При использовании этого метода приложения могут выбрать для себя подходящий компромисс между скоростью и гранулярностью.

спасибо -john

ADDENDUM:

Q: Какие варианты использования могут выиграть от использования CLOCK_MONOTONIC_COARSE или CLOCK_REALTIME_COARSE ?

A: В Linux 2.6.32 таймфрейм (2010-2011 гг.) "... рабочие нагрузки приложений (особенно баз данных и приложений финансовых служб) выполняют очень частые вызовы функций gettimeofday или аналогичных временных":

Redhat Enterprise: 2.6. gettimeofday speedup

Многие рабочие нагрузки приложений (особенно базы данных и финансовые службы)приложения) выполняют очень частые вызовы gettimeofday или аналогичные функции времени. Оптимизация эффективности этих вызовов может обеспечить значительные преимущества.

...