当前位置:  开发笔记 > 运维 > 正文

Linux clock_gettime(CLOCK_MONOTONIC)奇怪的非单调行为

如何解决《Linuxclock_gettime(CLOCK_MONOTONIC)奇怪的非单调行为》经验,为你挑选了3个好方法。

伙计们,在我的应用程序中,我正在使用clock_gettime(CLOCK_MONOTONIC)它来测量帧之间的增量时间(gamedev中的典型方法),并且我不时会遇到奇怪的行为clock_gettime(..)- 返回的值偶尔也不是单调的(即上一次.是更大的比目前的时间).

目前,如果发生这样的悖论,我只需跳过当前帧并开始处理下一帧.

问题是这怎么可能呢?这是Linux POSIX实现中的一个错误clock_gettime吗?我使用的是Ubuntu Server Edition 10.04(内核2.6.32-24,x86_64),gcc-4.4.3.



1> Dmitry Yudak..:

man clock_gettime 说:

CLOCK_MONOTONIC_RAW(自Linux 2.6.28起;特定于Linux)

与CLOCK_MONOTONIC类似,但可以访问不受NTP调整影响的原始硬件时间.

由于CLOCK_MONOTONIC_RAW不是NTP调整的主题,我猜CLOCK_MONOTONIC可能会.

我们在使用2.6.18内核的Redhat Enterprise 5.0和一些特定的Itanium处理器时遇到了类似的问题.我们无法在同一操作系统上使用其他处理器重现它.它在RHEL 5.3中得到修复,内核稍微更新一些,还有一些Redhat补丁.


实际上,MONOTONIC是作为REALTIME的偏移实现的.无论何时调整实时时钟或系统休眠,都会调整此偏移量.在错误的情况下,偏移量可能会被误算,从而导致MONOTONIC时钟的跳跃 - 甚至是向后跳跃.
CLOCK_MONOTONIC不应该向后跳(或向前); 如果确实如此,那就是一个错误.它受到NTP守护进程的细微调整(看起来像百万分之500),而CLOCK_MONOTONIC_RAW却没有.我的理解是"原始"单调时钟可能不是100%准确,因此NTP守护进程可以加速或减慢它的速度,使其与实际的时间流逝相匹配.如果你想每秒做N次,那么非原始时钟可能更准确.
我在内核时钟函数上工作了一段时间.*假设*工作的方式是MONOTONIC时钟永远不会倒退.这就是定义.

2> Michael Fouk..:

看起来像是一个实例

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming 
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

请参阅此处获取补丁.这包含在2.6.32.19中,但可能没有被Debian团队向后移植(?).你应该检查一下.



3> Matt Joiner..:

试试CLOCK_MONOTONIC_RAW.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有