【问题标题】:Is clock_nanosleep affected by adjtime and NTP?clock_nanosleep 是否受 adjtime 和 NTP 影响?
【发布时间】:2016-08-21 07:26:39
【问题描述】:

通常CLOCK_MONOTONIC_RAW用于获取不受NTP或adjtime()影响的时钟。但是clock_nanosleep() 不支持CLOCK_MONOTONIC_RAW 并且无论如何尝试使用它都会导致返回码95 不支持操作(内核4.6.0)。

clock_nanosleep() 是否会以某种方式将这些时钟调整考虑在内,还是会影响睡眠时间?

如果需要一个不受时钟调整影响的睡眠时间,有哪些替代方法?

【问题讨论】:

    标签: linux time timer linux-kernel


    【解决方案1】:

    CLOCK_MONOTONIC_RAW 从未支持 clock_nanosleep(),因为它在 Linux 2.6.28 中为 was introduced。在 2.6.32 because of oopses 中没有这种支持也是 explicitly fixed。在那之后代码已经被重构了几次,但在clock_nanosleep() 中仍然没有对CLOCK_MONOTONIC_RAW 的支持,而且我找不到任何关于为什么的 cmets。

    至少,有一个补丁明确禁用了此功能并且它通过了所有审查,这告诉我们,对于内核开发人员来说,这看起来不是一个大问题。所以,目前 (4.7) the only things CLOCK_MONOTONIC_RAW supports 是 clock_getres() 和 clock_gettime()。

    说到调整,already noted by Rich CLOCK_MONOTONIC 只是根据这个时钟的性质来调整速率。发生这种情况是因为hrtimer_interrupt() 使用调整后的单调时间值运行其队列(ktime_get_update_offsets_now()->timekeeping_get_ns()->timekeeping_delta_to_ns() 并且与xtime_nsec 一起运行,即subject to adjustment)。实际上,看看这段代码,我可能不再对 CLOCK_MONOTONIC_RAW 不支持 clock_nanosleep() 感到惊讶(而且将来可能不会支持)——调整后的单调时钟使用似乎是 hrtimers 的基础。

    至于替代品,我认为没有。 nanosleep() uses the same CLOCK_MONOTONIC,setitimer() has its own set of timers,alarm() uses ITIMER_REAL (same as setitimer()),那个(with some indirection)是also our good old friend CLOCK_MONOTONIC。我们还有什么?我猜没什么。

    作为一个不相关的旁注,有一个有趣的观察结果是,如果您调用 clock_nanosleep() 以获得相对间隔(不是 TIMER_ABSTIME)然后是 CLOCK_REALTIME actually becomes a synonym for CLOCK_MONOTONIC。

    【讨论】:

    • 非常有帮助的答案,感谢您的努力。所以根据Rich's answerCLOCK_MONOTONIC 比CLOCK_MONOTONIC_RAW 更准确,因此更适合小睡眠,特别是因为adjtime 调整对于短时间间隔可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-05-05
    相关资源
    最近更新 更多