【问题标题】:What is the difference between CLOCK_MONOTONIC & CLOCK_MONOTONIC_RAW?CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_RAW 有什么区别?
【发布时间】:2012-12-25 13:42:18
【问题描述】:

根据 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.

根据韦氏在线词典单调的意思是:

2: 具有从不增加或从不增加的性质 随着自变量或下标的值递减 的条款增加。

换句话说,它不会向后跳。我可以看到,如果您正在计时一些代码,这将是一个重要的属性。

但是,普通版和原始版之间的区别并不清楚。有人可以阐明 NTP 如何仍然影响 CLOCK_MONOTONIC 吗?

【问题讨论】:

    标签: linux ubuntu timing


    【解决方案1】:

    CLOCK_MONOTONIC 从未遇到过由于 NTP 时间调整而导致的不连续性,但它确实随着 NTP 了解本地振​​荡器和上游服务器之间存在的错误而改变频率。

    CLOCK_MONOTONIC_RAW 只是本地振荡器,不受 NTP 约束。如果您想针对由于 NTP 而不会与您对抗的时钟实现一些其他时间同步算法,这可能非常有用。虽然 ntpd(NTP 协议的参考实现和最广泛使用的 NTP 守护程序)被认为对时间调整“温和”,但更准确地说它对绝对时间很温和。如果您能够根据其他标准测量您的时钟频率,它愿意将时钟调整 500ppm。

    CLOCK_MONOTONIC_RAW 的实用性将受到限制,直到像 pthread_timedwait_monotonic 这样的设施提供使用该时基的选项。

    【讨论】:

    • 这个答案和另一个似乎在CLOCK_MONOTONIC 受到的影响方面相互矛盾。如果能有权威人士来解决这个问题,那就太好了。
    • @Dolda2000 答案在我看来是一致的。 CLOCK_MONOTONIC 受时钟 rate 更改(通过 adjtimex)影响,但不受跳跃影响。另一个答案只涉及非跳转案例。
    • 您在回答中所说的费率纪律在我看来与adjtime 引起的费率变化不一样;前者是调整汇率以更恰当地匹配实际汇率,后者是故意偏离真实汇率以调整绝对时间(这应该只影响CLOCK_REALTIME,而不是CLOCK_MONOTONIC,没有?)。
    • @Dolda2000:这是一个有趣的想法,但它不是这样工作的。内核维护CLOCK_REALTIME,因为这是一个更受欢迎的时钟。当您要求CLOCK_MONOTONIC 时,它会应用一个偏移量(本质上是启动时间)。当时钟步进时,等效的反步进被添加到偏移量中,这样单调时钟就不会被打乱。当时钟被调整或摆动(其效果在内核中混合在一起)时,实时偏移没有相应的反调整,因此它的频率发生了变化。
    • 存在一个错误,可能导致这些调整使 CLOCK_MONOTONIC 及时向后跳转。见:stackoverflow.com/a/3657433/3005946
    【解决方案2】:
    如果差异低于某个阈值,

    ntpd 不会导致时间跳跃。改为使用类似 adjtime 的调整,影响CLOCK_MONOTONICCLOCK_REALTIME(但显然不影响CLOCK_MONOTONIC_RAW)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 2011-04-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    相关资源
    最近更新 更多