我正在研究 CLOCK_REALTIME
和 CLOCK_MONOTONIC
之间的区别。
CLOCK_REALTIME 和 CLOCK_MONOTONIC 的区别是什么?
CLOCK_REALTIME
在时间上存在不连续性,可能会向前或向后跳跃:这是时钟的一个错误吗?一个给出不一致时间的时钟怎么能可靠呢?
我正在研究 CLOCK_REALTIME
和 CLOCK_MONOTONIC
之间的区别。
CLOCK_REALTIME 和 CLOCK_MONOTONIC 的区别是什么?
CLOCK_REALTIME
在时间上存在不连续性,可能会向前或向后跳跃:这是时钟的一个错误吗?一个给出不一致时间的时钟怎么能可靠呢?
尽管存在不完美,CLOCK_REALTIME应该是系统对当前UTC或民用时间的最佳估计。它是系统显示与您手表、墙上的时钟、手机或收听广播电台的时间相同的基础。(显示确实涉及从UTC到本地时间的转换;稍后再讲解此问题。)
但是,如果CLOCK_REALTIME将与现实世界中的UTC时间匹配,至少存在两个相当重要的问题:
如前所述,CLOCK_REALTIME并不完全是“墙上时间”,因为它实际上处理的是UTC时间。它使用了著名(臭名昭著?)的Unix/Posix representation,表示自1970年以来的UTC秒数。例如,CLOCK_REALTIME值为1457852399,对应于2016年3月13日06:59:59 UTC时间。在我所在的地方,比格林威治西五个小时,这对应于当地时间01:59:59。但是一秒钟后,对我来说并不是凌晨2点!实际上,1457852399 + 1 = 1457852400对应于03:00:00东部时间,因为那时候夏令时在这里开始。
我曾经建议,如果你的时钟出错了,时间跳跃是修复它的唯一方法,但这并不完全正确。如果你的时钟只有轻微偏差,通过“缓慢调整”时间(略微改变时钟频率)是可以逐渐纠正它的,这样几分钟或几小时后,它就会漂移到正确的时间而无需跳跃。这就是NTP试图做到的,尽管根据其配置,它可能只愿意为相对较小的错误进行这样的操作。最后,如果您想要跟踪准确的时间,并且想要避免在闰秒时出现跳跃或间断,那么您会遇到问题,因为传统的Unix/Linux(以及Windows和其他所有)计算机系统对闰秒的处理非常不好。在最近的(4.x?)Linux内核下,有一个CLOCK_TAI可能会有所帮助。一些实验性系统可能会实现另一个时钟CLOCK_UTC,它可以正确处理带有闰秒的UTC时间。然而,这两种方法都有一些其他的成本,而且您必须真正知道自己在做什么才能有效地使用它们,至少在当前的支持水平下是如此。有关更多信息,请参见LEAPSECS邮件列表。
CLOCK_MONOTONIC
解释为“系统已经运行的时间”符合POSIX标准:自过去某一时刻以来的时间并不会因为系统休眠而停止计算。 - caf
CLOCK_REALTIME
本身并不会在时区更改(或夏令时的开始/结束)时跳动。 - Lightness Races in Orbit