Что такое эпоха CLOCK_TAI?

Начиная с версии ядра Linux 3.10, функция clock_gettime() теперь принимает CLOCK_TAI.

Подробного описания этих часов найти не удалось. Какова его эпоха?

EDIT 1: только что сравнил вывод CLOCK_REALTIME и CLOCK_TAI в моей ОС Linux 3.19, и он возвращает точно такое же значение (1442582497)!? CLOCK_REALTIME уменьшается в секундах координации?

EDIT 2: Согласно эта статья, разница между CLOCK_TAI и (плохо названным) CLOCK_REALTIME должна составлять количество високосных секунд.

РЕДАКТИРОВАНИЕ 3. Причина, по которой CLOCK_TAI и CLOCK_REALTIME совпадают, объясняется в статье, на которую есть ссылка в Редактировании 2. Акцент сделан мной.

Для приложений, где можно было бы работать со временем TAI вместо UTC, ядро ​​предоставляет специальные часы CLOCK_TAI, которые включают секунды координации и не нуждаются в исправлении после секунды координации, полностью избегая проблемы с обратным скачком времени. . Он реализован как часы, работающие с фиксированным интегральным смещением по отношению к CLOCK_REALTIME, которое атомарно увеличивается на 1, когда часы CLOCK_REALTIME переводятся назад на дополнительную секунду. Он был представлен в ядре Linux версии 3.10 и доступен с ядрами, поставляемыми в RHEL7. Обратите внимание, что смещение от CLOCK_REALTIME инициализируется при загрузке до нуля, и ни ntpd, ни chronyd не устанавливают для него правильное значение по умолчанию (в настоящее время 35). Переключение на CLOCK_TAI в приложениях, конечно, потребует изменений в код и, возможно, также все протоколы, использующие представление времени Unix.

Редактировать 4: Этот ответ, полученный на Ask Ubuntu, все проясняет.


person chmike    schedule 18.09.2015    source источник
comment
Его может не быть, например CLOCK_MONOTONIC.   -  person Colonel Thirty Two    schedule 18.09.2015
comment
en.wikipedia.org/wiki/International_Atomic_Time ?   -  person EOF    schedule 18.09.2015
comment
@ColonelThirtyTwo В TAI должна быть эпоха, чтобы можно было преобразовать его в григорианский формат.   -  person chmike    schedule 18.09.2015
comment
@chmike Я разместил свой ответ здесь, по адресу здесь   -  person Ravan    schedule 05.10.2015


Ответы (1)


CLOCK_TAI is basically designed as CLOCK_REALTIME(UTC) + tai_offset.  

Таким образом, часть usec/nsec timeval/timespec должна быть идентичной.

CLOCK_MONOTONIC: Zeroed at boot.  

CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset    

CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset  

Но из-за проблем с производительностью (CLOCK_REALTIME — это то, что больше всего забивает приложения), в Linux мы на самом деле структурируем это как:

CLOCK_REALTIME: Initialized at boot from RTC  
CLOCK_MONOTONIC: CLOCK_REALTIME - wall_to_monotonic  
CLOCK_TAI: CLOCK_REALTIME + tai_offset

So CLOCK_REALTIME and CLOCK_TAI return the same because the kernel parameter tai_offset is zero.

Проверьте с помощью adjtimex(timex tmx) и прочитайте значение. Я думаю, что ntpd установит его, если он достаточно новый (>4.2.6) и имеет файл дополнительной секунды. Он также может получить его с вышестоящих серверов, но я не смог проверить. Вызов adjtimex() может установить tai_offset вручную при запуске от имени пользователя root.

Моя ссылка здесь и здесь

person Ravan    schedule 20.09.2015