我正在阅读CLOCK_REALTIME和之间的区别CLOCK_MONOTONIC
CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?
该CLOCK_REALTIME在时间的不连续性,可以跳向前和向后:是,在这个时钟的错误?如何使时间不一致的时钟可靠?
Ste*_*mit 14
尽管存在不完善之处,但CLOCK_REALTIME应该是系统对当前UTC或民用时间的最佳估计.它是系统能够显示您看到手表,墙上时钟或手机,或收听广播时间广播等时间的相同时间的基础.(显示确实涉及从UTC到本地时间的转换;稍后将详细介绍.)
但是如果CLOCK_REALTIME要匹配现实世界中的UTC时间,那么至少存在两个相当重要的问题:
因此,当你读到CLOCK_REALTIME可能有不连续性时,可能会向前跳转,也可能向后跳转,这不是一个错误,它是一个特性:CLOCK_REALTIME 必须具备这些可能性,如果它是用闰秒和偶尔错误的时钟来应对现实世界的话.
因此,如果您编写的代码应该与现实世界中的代码相匹配,那么CLOCK_REALTIME就是您想要的,瑕疵和所有代码.但理想情况下,如果偶尔由于某种原因向前或向后跳跃,那么你将以一种合理优雅的方式编写代码(不会崩溃或做一些奇怪的事情).
正如您可能从您引用的另一个问题中得知的那样,CLOCK_MONOTONIC保证始终以每秒一秒的速度前进,没有跳跃或不连续,但时钟的绝对值并不意味着太多.如果CLOCK_MONOTONIC值为13:05,这并不意味着它只是在下午一点之后,通常意味着计算机已启动并运行了13小时5分钟.
所以如果你感兴趣的是相对时间,那么CLOCK_MONOTONIC就可以了.特别是,如果你想花时间花些多长时间,取两个CLOCK_MONOTONIC值并减去它们是可取的,因为如果某种时间跳转(这会影响CLOCK_REALTIME),它就不会给你一个错误的答案.之间.
或者,总而言之,正如人们在评论主题中所说,CLOCK_REALTIME是绝对时间所需要的,而CLOCK_MONOTONIC对于相对时间更好.
现在,还有几点.
如上所述,CLOCK_REALTIME并非完全"挂起时间",因为它实际上处理UTC.它使用自1970年以来着名的(臭名昭着的?)Unix/Posix表示秒数.例如,CLOCK_REALTIME值为1457852399转换为2016年3月13日06:59:59 UTC.我居住的地方,格林威治以西5小时,翻译为当地时间01:59:59.但一秒钟之后,1457852400翻译为03:00:00,因为夏令时开始了.
我建议如果你的时钟错了,时间跳跃几乎是修复它的唯一方法,但那不是真的.如果您的时钟稍微关闭,可以通过逐渐"回转"时间(稍微改变时钟频率)来纠正它,这样几分钟或几小时后它就会漂移到正确的时间而不会跳跃.这就是NTP尝试做的事情,虽然根据其配置,它可能只愿意为那些非常小的错误做到这一点.
我说CLOCK_MONOTONIC通常是计算机启动和运行的时间.这标准不能保证; 所有标准都说CLOCK_MONOTONIC从某个任意时间点开始计算时间.在系统启动时实现CLOCK_MONOTONIC的系统上,可以有两种解释:是自启动以来的时间,还是系统启动和运行的时间(即,在任何时候处于睡眠或暂停状态时减去) ?在许多系统上,还有另一个时钟CLOCK_BOOTTIME计算自启动以来的时间(无论是启动还是暂停),而CLOCK_MONOTONIC只计算系统启动和运行的时间.
最后,如果你想要挂钟时间,但是你想避免在闰秒时出现跳跃或不连续,你就会遇到问题,因为传统的Unix/Linux(以及Windows,以及所有其他)计算机系统中的闰秒处理能力很差.在最近的(4.x?)Linux内核中,有一个可能有帮助的CLOCK_TAI.一些实验系统可以实现另一个时钟CLOCK_UTC,它正确处理闰秒.这两个都有其他一些成本,你必须真正知道你有效地使用它们,至少在今天的支持水平.有关更多信息,请参阅LEAPSECS邮件列表.