CLOCK_MONOTONIC进程(或线程)是否具体?

Ben*_*ird 6 c linux time multithreading process

如果我使用clock_gettime(CLOCK_MONOTONIC,x)获得时间,则调用yield(例如sched_yield()),然后再次获得CLOCK_MONOTONIC时间,时间的差异是否包括程序未运行的时间(已经产生),或者CLOCK_MONOTONIC只跟踪程序执行的时间吗?我的测试似乎暗示后者,但我想知道肯定.

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

jan*_*neb 8

答案马克西姆及其评论回答了你问题的第二部分,我相信.为了扩展第一部分的答案,POSIX 2008指出

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实现中发现了一个错误,要么更有可能在你的测试程序中找到了错误.


Max*_*kin 5

CLOCK_REALTIME和CLOCK_MONOTONIC之间的唯一区别是后者无法设置.即使您的进程未运行,这些时钟也在滴答作响.

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

注意,单调时钟的绝对值是没有意义的(因为它的原点是任意的),因此不需要设置它.此外,实时应用程序可以依赖于此时钟的值从未设置的事实,因此,使用此时钟测量的时间间隔不会受到对clock_settime()的调用的影响.

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

man clock_gettime

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

  • 我相信那些提到的NTP调整是指时钟前进的*rate*,而不是跳跃(`CLOCK_MONOTONIC`不会向后跳过).请注意,当机器暂停时,"CLOCK_MONOTONIC"会停止,如果这很重要的话. (3认同)
  • 不,CLOCK_MONOTONIC不会在Linux上倒退.NTP仅在步长变化超过1/2秒时调整时间,单调时钟不受此影响.对于较小的调整,NTP通过稍微改变时钟滴答率来随时间调整时钟,并且CLOCK_MONOTONIC受此影响.但是,滴答率永远不会是负面的. (3认同)
  • @Maxim:我认为这个论点是,在大多数情况下,调整时间仍然是区间测量的首选,因为PC时钟不是特别精确.我的理解是NTP时钟频率调整非常小,越接近它开始的正确时间越小. (2认同)