CLOCK_REALTIME有什么用?

时间:2017-01-27 12:39:37

标签: c clock gettime

我正在阅读function handleSomeUserInteraction(appClasses, parentAppClassId, appClassId) { return function(dispatch) { //make a copy of appClasses, so you wont change the state directly let newAppClasses = Object.assign({}, appClasses) //do all logic work to compute new appClasses //... //... //handleUpdateInitialSourceFetch dispatch({ type: types.UPDATE_INITIAL_SOURCE_FETCH, appClasses: newAppClasses } //handleToggleAppClass dispatch({ type: types.TOGGLE_APP_CLASS, appClasses: newAppClasses }) } } CLOCK_REALTIME

之间的区别

Difference between CLOCK_REALTIME and CLOCK_MONOTONIC?

CLOCK_MONOTONIC在时间上有不连续性,可以向前和向后跳跃:这个时钟中的错误是什么?如何使时间不一致的时钟可靠?

1 个答案:

答案 0 :(得分:14)

尽管存在不完善之处,但CLOCK_REALTIME应该是系统对当前UTC或民用时间的最佳估计。它是系统显示同一时间的基础,您可以看到您是看着手表,墙上的时钟,还是手机,还是倾听时间在广播电台等广播(显示确实涉及从UTC到当地时间的转换;稍后将详细介绍。)

但是如果CLOCK_REALTIME要与现实世界中的UTC时间相匹配,那么至少存在两个相当重要的问题:

  1. 如果有人不小心将计算机上的时钟设置错误怎么办?他们将不得不修复它,并且修复可能涉及时间跳跃。几乎没有办法,特别是如果错误很大(如,几小时或几天)。
  2. 遗憾的是,大多数计算机无法表示闰秒。因此,当现实世界中出现闰秒时,大多数计算机时钟都需要跳跃一点。
  3. 因此,当您读到CLOCK_REALTIME可能存在不连续性时,可能会向前跳转以及向后跳转,这不是错误,它是一个功能:CLOCK_REALTIME 必须具有这些可能性,如果它用闰秒和偶尔错误的时钟来应对现实世界。

    因此,如果您正在编写的代码应该与现实世界中的代码相匹配,那么CLOCK_REALTIME就是您想要的,瑕疵和所有代码。但是,理想情况下,如果偶尔出现某种原因,时钟会向前或向后跳跃,那么您将以一种合理优雅的方式编写代码(不会崩溃或做一些奇怪的事情)。

    正如您可能从您引用的其他问题中了解到的那样,CLOCK_MONOTONIC始终保证始终以每秒一秒的速度向前迈进,没有跳跃或不连续,时钟的绝对值并非## 39;意思是很多。如果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 mailing list