clock_getres和内核2.6

时间:2011-07-04 16:38:44

标签: time kernel resolution clock

我现在正在使用ubuntu 11.04并使用v2lin从vxWorks tolinux移植我的程序。我有clock_getres()的问题。

使用此代码:

struct timespec res;
clock_getres(CLOCK_REALTIME, &res);

我有 res.tv_nsec = 1 ,这在某种程度上是不正确的。

就像这个人显示:http://forum.kernelnewbies.org/read.php?6,377,423,内核2.4和2.6之间存在差异。

那么内核2.6中时钟分辨率的正确值应该是什么

由于

3 个答案:

答案 0 :(得分:1)

根据内核源代码中的“include / linux / hrtimer.h”文件,clock_getres()将始终为高分辨率计时器返回1ns(1纳秒)(如果系统中有这样的计时器)。此值是硬编码的,这意味着:“计时器的值将四舍五入到它”

http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/hrtimer.h

269 /*
270  * The resolution of the clocks. The resolution value is returned in
271  * the clock_getres() system call to give application programmers an
272  * idea of the (in)accuracy of timers. Timer values are rounded up to
273  * this resolution values.
274  */
275 # define HIGH_RES_NSEC          1
276 # define KTIME_HIGH_RES         (ktime_t) { .tv64 = HIGH_RES_NSEC }
277 # define MONOTONIC_RES_NSEC     HIGH_RES_NSEC
278 # define KTIME_MONOTONIC_RES    KTIME_HIGH_RES

对于低分辨率定时器(如果没有hrtimer硬件,对于MONOTONIC和REALTIME时钟),linux将返回1 / HZ(典型的HZ从100到1000;因此值将是1到10 ms):< / p>

http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/ktime.h#L321

321 #define LOW_RES_NSEC            TICK_NSEC
322 #define KTIME_LOW_RES           (ktime_t){ .tv64 = LOW_RES_NSEC }

来自低分辨率计时器的值可以四舍五入到如此低的精度(实际上它们就像jiffles,linux内核“滴答”)。

PS:据我所知,这篇文章http://forum.kernelnewbies.org/read.php?6,377,423比较了没有启用hrtimers(实现)的2.4 linux和2.6内核可用的hrtimers。所以所有的数值都是正确的。

答案 1 :(得分:0)

尝试从procfs获取它。

cat / proc / timer_list

答案 2 :(得分:0)

为什么你认为它不正确?

例如,在现代x86 CPU上,内核使用TSC提供高分辨率时钟 - 任何高于1Ghz的CPU都有一个比每纳秒刻度更快的TSC,所以纳秒分辨率非常普遍。 p>