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

时间:2011-02-09 10:41:01

标签: c linux multithreading process time

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

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

2 个答案:

答案 0 :(得分: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实现中发现了一个错误,要么更有可能在你的测试程序中发现错误。

答案 1 :(得分: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调整影响的原始硬件时间。