【问题标题】:Is CLOCK_MONOTONIC process (or thread) specific?CLOCK_MONOTONIC 进程(或线程)是特定的吗?
【发布时间】:2011-06-24 01:04:06
【问题描述】:

如果我使用clock_gettime(CLOCK_MONOTONIC,x) 获取时间,然后调用yield(例如sched_yield()),然后再次获取CLOCK_MONOTONIC 时间,时间差异是否包括程序未运行的时间(已yield ),还是 CLOCK_MONOTONIC 只跟踪程序执行的时间?我的测试似乎暗示了后者,但我想确定一下。

另外,如果 CLOCK_MONOTONIC 不包括产生的时间,是否还有另一个单调计时器(即不受 ntp 引起的跳跃影响)?

【问题讨论】:

    标签: c linux multithreading process time


    【解决方案1】:

    CLOCK_REALTIME 和 CLOCK_MONOTONIC 的唯一区别是后者不能设置。即使您的进程没有运行,这些时钟也会滴答作响。

    http://www.opengroup.org/onlinepubs/009604599/functions/clock_getres.html

    注意,单调时钟的绝对值是没有意义的(因为它的起源是任意的),因此不需要设置它。此外,实时应用程序可以依赖于这个时钟的值永远不会设置的事实,因此,用这个时钟测量的时间间隔不会受到调用 clock_settime() 的影响。

    在 Linux 中,令人惊讶的是,CLOCK_MONOTONIC 似乎仍然受到 NTP 调整的影响,因此它可能会倒退。因此他们添加了另一个时钟 CLOCK_MONOTONIC_RAW:

    人clock_gettime

    CLOCK_MONOTONIC_RAW(自 Linux 2.6.28 起;特定于 Linux)类似于 CLOCK_MONOTONIC,但提供对不受 NTP 调整影响的基于硬件的原始时间的访问。

    【讨论】:

    • 我相信提到的那些 NTP 调整指的是时钟前进的 速率,而不是跳跃(CLOCK_MONOTONIC 不会向后跳过)。请注意,如果这很重要,CLOCK_MONOTONIC 会在机器暂停时停止。
    • 不,CLOCK_MONOTONIC 在 Linux 上不会倒退。 NTP 仅在关闭超过 1/2 秒时才会通过步进变化调整时间,单调时钟不受此影响。对于较小的调整,NTP 通过稍微改变时钟滴答率随时间调整时钟,CLOCK_MONOTONIC 受此影响。但是,滴答率永远不会是负数。
    • 这并不能完全回答我的问题——我知道它会在机器暂停时停止,但是当 进程 暂停时它会停止吗?
    • @Maxim:我认为在大多数情况下,调整后的时间仍然是间隔测量的首选,因为 PC 时钟并不是特别精确。我的理解是NTP时钟频率调整很小,越小越接近它开始的正确时间。
    • CLOCK_MONOTONIC 不应该倒退,但显然在某些系统上已经看到这样做了。见stackoverflow.com/questions/3657289/…
    【解决方案2】:

    我相信,Maxim 和 cmets 的答案回答了您问题的第二部分。为了扩展第一部分的答案,POSIX 2008 states

    If the Monotonic Clock option is supported, all implementations shall support a clock_id of CLOCK_MONOTONIC defined in <time.h>. This clock represents the monotonic clock for the system. For this clock, the value returned by clock_gettime() represents the amount of time (in seconds and nanoseconds) since an unspecified point in the past (for example, system start-up time, or the Epoch). This point does not change after system start-up time.

    特别要注意“系统的单调时钟”。也就是说,每个系统而不是每个进程,即使您的进程没有运行,它也会继续运行。此外,“这一点在系统启动时间后不会改变。”,这再次意味着无论特定进程是在运行还是在休眠,它都会保持滴答声。

    所以,要么你在 Linux 实现中发现了一个错误,要么更有可能是在你的测试程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多