【问题标题】:clock_getres and Kernel 2.6clock_getres 和内核 2.6
【发布时间】:2023-03-14 23:57:01
【问题描述】:

我现在使用 ubuntu 11.04 并使用 v2lin 将我的程序从 vxWorks 移植到 Linux。我对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 中时钟分辨率的正确值应该是多少

谢谢

【问题讨论】:

  • 是什么让你认为它不正确?

标签: time kernel resolution clock


【解决方案1】:

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

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 毫秒):

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 可用。所以所有的值都是正确的。

【讨论】:

    【解决方案2】:

    尝试从 procfs 获取它。

    cat /proc/timer_list

    【讨论】:

      【解决方案3】:

      为什么你认为它不正确?

      例如,在现代 x86 CPU 上,内核使用 TSC 来提供高分辨率时钟 - 任何以高于 1Ghz 运行的 CPU 都有一个 TSC,其滴答速度超过每纳秒一个滴答,因此纳秒分辨率很常见。

      p>

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 2011-09-03
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        相关资源
        最近更新 更多