为什么CLOCK_TAI和CLOCK_REALTIME返回相同的值?

为什么CLOCK_TAI和CLOCK_REALTIME返回相同的值?

CLOCK_TAI在我的 Ubuntu 15.04 (Linux Kernel 3.19.0-28-generic) 上,当我使用 请求和CLOCK_REALTIME时,我得到了相同的值。这显然是一个错误,因为 和clock_gettime()之间的差异应该是闰秒数加上纪元差异,考虑到CLOCK_TAICLOCK_REALTIME本文关于 RedHat 操作系统。

答案1

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

因此 timeval/timespec 的 usec/nsec 部分应该相同。

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

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

使用检查adjtimex(timex tmx)并读取值。我认为ntpd如果它足够新(>4.2.6)并且有闰秒文件,它将设置它。它也可能能够从上游服务器获取它,但我无法验证。以 root 身份运行时adjtimex()可以手动设置该调用。tai_offset

我的参考资料这里这里

答案2

答案可以在所引用的文章中找到。重点是我加的。

对于可以使用 TAI 时间而不是 UTC 的应用程序,内核提供了一个特殊的 CLOCK_TAI 时钟,它包含闰秒,并且闰秒后无需校正,从而完全避免了时间向后跳转的问题。它被实现为一个以固定的整数偏移量运行的时钟,与 CLOCK_REALTIME 时钟在闰秒时向后移动时,该时钟会原子地增加 1。它是在 Linux 内核版本 3.10 中引入的,并随 RHEL7 中附带的内核提供。请注意,CLOCK_REALTIME 的偏移量在启动时初始化为零,并且 ntpd 和 chronyd 都不会默认将其设置为正确值(当前为 35)。在应用程序中切换到 CLOCK_TAI 当然需要修改代码,甚至可能还需要修改所有使用 Unix 时间表示的协议。

相关内容