CLOCK_MONOTONIC和CLOCK_MONOTONIC_RAW有什么区别?

55

根据Ubuntu下的Linux手册

CLOCK_MONOTONIC
      Clock that cannot be set and  represents  monotonic  time  since
      some unspecified starting point.

CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
      Similar  to  CLOCK_MONOTONIC, but provides access to a raw hard‐
      ware-based time that is not subject to NTP adjustments.
根据Webster在线词典,Monotonic的含义为:
2:具有独立变量或项的下标增加时要么永远不增加,要么永远不减少的属性。
换句话说,它不会向后跳跃。如果您正在计时某些代码,则我可以看到这将是一个重要的属性。
然而,普通版本和原始版本之间的差异并不清楚。是否有人能够阐明NTP如何仍能影响CLOCK_MONOTONIC?
2个回答

48

CLOCK_MONOTONIC 由于NTP时间调整不会出现不连续性,但是由于NTP学习本地振荡器和上游服务器之间的误差而发生频率变化。

CLOCK_MONOTONIC_RAW 简单来说就是本地振荡器,不受NTP的影响。如果您想对抗NTP而实现其他时间同步算法,这可能非常有用。虽然ntpd(NTP协议的参考实现和最广泛的NTP守护程序)被认为是对时间调整“温和”,但更准确地说,它对绝对时间很温和。它愿意将时钟偏移500ppm,如果您能够测量时钟频率并针对某些其他标准进行比较,则这相当戏剧性。

pthread_timedwait_monotonic 这样的工具要使用 CLOCK_MONOTONIC_RAW 时间基准选项才能发挥其作用。


这个答案和另一个答案似乎在CLOCK_MONOTONIC的影响方面存在矛盾。如果有权威来源能够澄清差异,那将非常好。 - Dolda2000
2
@Dolda2000,我认为这些答案是一致的。CLOCK_MONOTONIC 受到时钟速率变化(通过 adjtimex)的影响,但不受跳跃的影响。另一个答案只讨论了非跳跃情况。 - Ben Jackson
你在回答中提到的速率调整似乎与adjtime引起的速率变化不同;前者是为了更准确地匹配实际速率而进行的调整,而后者是为了调整绝对时间而故意偏离真实速率的异常情况(这应该只影响CLOCK_REALTIME,而不是CLOCK_MONOTONIC,对吗?)。 - Dolda2000
1
@Dolda2000:这是一个有趣的想法,但它并不是这样工作的。内核维护CLOCK_REALTIME ,因为这是一个更受欢迎的时钟。当你请求CLOCK_MONOTONIC 时,它会应用一个偏移量(基本上是启动时间)。当时钟被调整时,相应的反向调整被添加到偏移量中,以使单调时钟不受干扰。当时钟被调整或倾斜时(其效果在内核中混合在一起),实时偏移量没有相应的计数器调整,因此它的频率发生变化。 - Ben Jackson
1
@Bionix1441 计算机中的大多数时钟都很廉价且走得太快或太慢。NTP 与另一台具有更好时间的计算机/设备通信,以便通过大幅度调整时间或使时间运行更快/更慢来纠正本地机器上的这些问题。有关详细信息,请参见http://www.ntp.org/ntpfaq/NTP-s-algo.htm。 - Anon
显示剩余5条评论

3

ntpd 不会在时间差低于一定阈值时导致时间跳变。相反,使用类似于 adjtime 的调整方法,影响 CLOCK_MONOTONICCLOCK_REALTIME 两者(但显然不包括 CLOCK_MONOTONIC_RAW)。


1
嵌入式系统开发人员可能使用2.6.x内核,需要注意以下例外情况:https://dev59.com/N3A65IYBdhLWcg3wvhXi#3657433 - breakpoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接