首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLOCK_TAI的时代是什么?

CLOCK_TAI的时代是什么?
EN

Stack Overflow用户
提问于 2015-09-18 13:00:17
回答 1查看 4.2K关注 0票数 4

由于Linux内核版本为3.10,函数clock_gettime()现在接受CLOCK_TAI

我没能找到这只钟的详细描述。它的时代是什么?

编辑1:刚刚比较了Linux3.19OS上CLOCK_REALTIME和CLOCK_TAI的输出,它返回的值完全相同(1442582497) !?CLOCK_REALTIME是在闰秒时减少的吗?

编辑2:根据这篇文章,CLOCK_TAI和(糟糕的) CLOCK_REALTIME之间的区别应该是闰秒的数量。

编辑3:在Edit 2中引用的文章解释了CLOCK_TAICLOCK_REALTIME同时存在的原因。

对于可以使用TAI时间而不是UTC的应用程序,内核提供了一个特殊的CLOCK_TAI时钟,其中确实包含了闰秒,并且不需要在闰秒之后进行校正,从而完全避免了时间上的反向跳转问题。它被实现为一个时钟,运行在一个固定的积分偏移量到CLOCK_REALTIME,当CLOCK_REALTIME时钟在闰秒上向后退时,该时钟原子地递增1。它是在LinuxVersion3.10中引入的,可以在RHEL7中提供的内核中使用。请注意,自CLOCK_REALTIME的偏移量在引导时初始化为零,默认情况下,ntpd或chronyd都不将其设置为正确的值(当前为35)。在应用程序中切换到CLOCK_TAI当然需要修改代码,也可能需要修改所有使用Unix表示时间的协议。

编辑4:在Ask Ubuntu上获得的这个答案澄清了一切。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-20 01:52:32

代码语言:javascript
复制
CLOCK_TAI is basically designed as CLOCK_REALTIME(UTC) + tai_offset.  

因此,时间/时间的usec/nsec部分应该是相同的。

代码语言:javascript
复制
CLOCK_MONOTONIC: Zeroed at boot.  

CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset    

CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset  

但是由于性能方面的考虑(CLOCK_REALTIME是应用程序最看重的),在Linux中,我们实际上将其结构为:

代码语言:javascript
复制
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)并且有一个闰秒文件,它就会设置它。它也可以从上游服务器获得它,但我还无法验证。调用adjtimex()可以在以根用户身份运行时手动设置tai_offset

我的参考资料这里这里

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32652688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档