CLOCK_REALTIME有什么用?

What is the use of CLOCK_REALTIME?

我正在阅读 CLOCK_REALTIMECLOCK_MONOTONIC

之间的区别

Difference between CLOCK_REALTIME and CLOCK_MONOTONIC?

CLOCK_REALTIME 的时间不连续,可以向前跳也可以向后跳:这是这个时钟的错误吗?时间不一致的时钟怎么可能可靠?

尽管不完善,CLOCK_REALTIME 应该是系统对当前 UTC 或民用时间的最佳估计。它是系统能够显示您所看到的同一时间的基础,如果您看着您的手表、墙上的时钟、您的手机 phone,或收听广播电台的时间广播,等等(显示确实涉及从 UTC 到本地时间的转换;稍后会详细介绍。)

但是如果 CLOCK_REALTIME 与现实世界中的 UTC 时间匹配,至少有两个非常重要的问题:

  1. 如果有人不小心将您计算机上的时钟设置错误怎么办?他们将不得不修复它,修复可能涉及时间跳跃。几乎没有办法解决这个问题,特别是如果错误很大(例如,数小时或数天)。
  2. 不幸的是,大多数计算机无法表示 leap seconds。因此,当现实世界中出现闰秒时,大多数计算机时钟都必须跳一点。

所以当你读到 CLOCK_REALTIME 可能有不连续性,可能向前跳也可能向后跳,这不是错误,这是一个特性:CLOCK_REALTIME must 有这些可能性,如果它是为了应对具有闰秒和 occasionally-wrong 时钟的现实世界。

因此,如果您正在编写的代码应该与现实世界中的时间相匹配,那么 CLOCK_REALTIME 就是您想要的,完美无缺。不过,理想情况下,如果系统时钟偶尔由于某种原因向前或向后跳动,您将以这样一种方式编写代码,使其表现得相当优雅(不会崩溃或做一些奇怪的事情)。

您可能从您引用的另一个问题中了解到,CLOCK_MONOTONIC 保证始终以每秒正好一秒的速度前进,没有跳跃或中断,但是[=52= 】 时钟的绝对值意义不大。如果 CLOCK_MONOTONIC 值为 13:05,这并不意味着它只是在下午一点之后,它通常意味着计算机已经启动并且 运行 了 13 小时 5 分钟。

因此,如果您只对相对时间感兴趣,CLOCK_MONOTONIC 就可以了。特别是,如果你想计算某件事花了多长时间,通过从结束时间减去开始时间,最好为此使用 CLOCK_MONOTONIC 值,因为如果有一些,他们不会给你一个错误的答案两者之间有一种时间跳跃(这会影响 CLOCK_REALTIME)。

或者,总而言之,正如人们在评论线程中所说,CLOCK_REALTIME 是绝对时间所需要的,而 CLOCK_MONOTONIC 是相对时间更好的。

现在,还有几点。

如前所述,CLOCK_REALTIME 不完全是“挂钟时间”,因为它实际上使用的是 UTC。它使用自 1970 年以来著名的(臭名昭著的?)Unix/Posix representation UTC 秒数。例如,CLOCK_REALTIME 值 1457852399 转换为 2016 年 3 月 13 日的 06:59:59 UTC。我住的地方,五格林威治以西数小时,对应 01:59:59 当地时间。但是一秒后对我来说不是2:00早上!事实上,1457852399 + 1 = 1457852400 对应于 03:00:00 东部时间,因为那是夏令时开始的时间。

我建议如果你的时钟有误,时间跳跃几乎是唯一的修复方法,但事实并非如此。如果你的时钟只是稍微偏离,可以通过逐渐“调整”时间(通过稍微改变时钟频率)来纠正它,这样在几分钟或几小时后它就会漂移到正确的时间而不会跳跃。这就是 NTP 试图做的,尽管根据其配置,它可能只愿意为非常小的错误这样做。

我说的是CLOCK_MONOTONIC一般是电脑开机的时间,运行。标准不能保证这一点;所有标准都说 CLOCK_MONOTONIC 从某个任意时间点开始计算时间。在将 CLOCK_MONOTONIC 作为系统启动时间的系统上,可以有两种解释:是自启动后的时间,还是系统启动的时间和 运行(即减去任何时候它睡着或暂停)?在许多系统上,还有另一个时钟 CLOCK_BOOTTIME,它计算自启动以来的时间(无论是启动还是挂起),而 CLOCK_MONOTONIC 只计算系统启动的时间和 运行.

我说过,“CLOCK_MONOTONIC 保证始终以每秒正好一秒的速度向前迈进”,但这也可能不是严格正确的。如果您的计算机正在执行 time-slewing 操作,试图逐渐更正绝对时间错误,那么 CLOCK_MONOTONIC 可能会暂时以每秒 1.001 秒或每秒 0.999 秒的速度步进第二,或类似的东西。差异通常很小,但如果对您来说很重要,某些系统还有其他时钟类型可供您使用,例如 CLOCK_MONOTONIC_RAW,它们应该没有这种扰动。

最后,如果您想跟踪本征时间,您希望避免在闰秒,你遇到了一个问题,因为传统 Unix/Linux(和 Windows,以及所有其他)计算机系统对闰秒的处理不佳。在最近的 (4.x?) Linux 内核下,有一个 CLOCK_TAI 可能会有所帮助。一些实验系统可能会实现另一个时钟,CLOCK_UTC, which handles UTC time with leap seconds properly. Both of those have some other costs, though, and you'd have to really know what you were doing to use them effectively, at least with today's level of support. See the LEAPSECS mailing list 了解更多信息。