sca*_*cai 9 linux time timer linux-kernel
通常CLOCK_MONOTONIC_RAW用于获取不受NTP或NTP影响的时钟adjtime().但是clock_nanosleep()不支持CLOCK_MONOTONIC_RAW并尝试使用它无论如何都会导致返回代码95 操作不受支持(内核4.6.0).
是否会clock_nanosleep()以某种方式考虑这些时钟调整或睡眠时间会受到影响?
如果需要一个不受时钟调整影响的休眠时间,有哪些替代方案?
CLOCK_MONOTONIC_RAWclock_nanosleep()自从Linux 2.6.28 中引入以来从未得到支持。由于 oopses ,它也被明确修复为在 2.6.32 中不支持此功能。此后代码已被重构多次,但仍然不支持in ,而且我无法找到任何关于原因的评论。CLOCK_MONOTONIC_RAWclock_nanosleep()
至少,有一个补丁明确禁用了此功能并且它通过了所有审查,这一事实告诉我们,这对于内核开发人员来说似乎不是一个大问题。因此,目前 (4.7)唯一CLOCK_MONOTONIC_RAW支持的是clock_getres()和clock_gettime()。
说到调整,正如Rich 已经指出的那样, 速率调整只是由时钟的性质决定的CLOCK_MONOTONIC 。发生这种情况是因为hrtimer_interrupt()使用调整后的单调时间值运行其队列(ktime_get_update_offsets_now() -> timekeeping_get_ns() -> timekeeping_delta_to_ns()并且其操作xtime_nsec需要调整)。实际上,看看这段代码,我可能不再感到惊讶,因为它CLOCK_MONOTONIC_RAW不支持clock_nanosleep()(并且将来可能不会支持)——调整后的单调时钟使用似乎是 hrtimers 的基础。
至于替代方案,我认为没有。nanosleep()使用相同的CLOCK_MONOTONIC,setitimer()有它自己的一组定时器,alarm()使用 ITIMER_REAL (相同setitimer()),那个(带有一些间接)也是我们的好老朋友CLOCK_MONOTONIC。我们还有什么?我猜没什么。
作为一个不相关的旁注,有一个有趣的观察,如果您调用clock_nanosleep()相对间隔(不是TIMER_ABSTIME),那么CLOCK_REALTIME实际上就成为 的同义词CLOCK_MONOTONIC。
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |