将jiffies转换为毫秒

时间:2010-04-28 16:47:27

标签: linux linux-kernel

如何在Linux中手动将jiffies转换为毫秒,反之亦然?我知道内核2.6有一个功能,但我正在研究2.4(作业),虽然我看了代码它使用了很多宏常量我不知道它们是否在2.4中定义。

4 个答案:

答案 0 :(得分:45)

如上一个答案所述,jiffies增量的比率是固定的。

为接受jiffies的函数指定时间的标准方法是使用常量HZ

这是Hertz的缩写,或每秒的滴答数。在计时器滴答设置为1ms的系统上,HZ = 1000。某些发行版或体系结构可能使用另一个数字(过去常见的是100)。

为函数指定jiffies计数的标准方法是使用HZ,如下所示:

schedule_timeout(HZ / 10);  /* Timeout after 1/10 second */

在大多数情况下,这种方法都可以。

2*HZ     /* 2 seconds in jiffies */
HZ       /* 1 second in jiffies */
foo * HZ /* foo seconds in jiffies */
HZ/10    /* 100 milliseconds in jiffies */
HZ/100   /* 10 milliseconds in jiffies */
bar*HZ/1000 /* bar milliseconds in jiffies */

最后两个有一点问题,但是,在具有10 ms计时器滴答的系统上,HZ/100为1,并且精度开始受到影响。你可能会在0.0001和1.999计时器滴答之间的任何地方得到延迟(基本上是0-2毫秒)。如果您尝试在10ms刻度系统上使用HZ/200,则整数除法会为您提供0个jiffies!

所以经验法则是,小心使用HZ(接近1 jiffie)时要非常小心。

要转换另一种方式,您可以使用:

jiffies / HZ          /* jiffies to seconds */
jiffies * 1000 / HZ   /* jiffies to milliseconds */

你不应该期望任何比毫秒精度更好的东西。

答案 1 :(得分:14)

Jiffies在Linux 2.4中是硬编码的。检查HZ的定义,该定义在特定于体系结构的param.h中定义。它通常是100赫兹,即每隔一个刻度(1秒/ 100刻度* 1000毫秒/秒)10毫秒。

这适用于i386,HZ在include/asm-i386/param.h中定义。

include/linux/time.h中有一些名为timespec_to_jiffiesjiffies_to_timespec的功能,您可以在struct timespecjiffies之间来回转换:

    #define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)

    static __inline__ unsigned long
    timespec_to_jiffies(struct timespec *value)
    {
            unsigned long sec = value->tv_sec;
            long nsec = value->tv_nsec;

            if (sec >= (MAX_JIFFY_OFFSET / HZ))
                    return MAX_JIFFY_OFFSET;
            nsec += 1000000000L / HZ - 1;
            nsec /= 1000000000L / HZ;
            return HZ * sec + nsec;
    }

    static __inline__ void
    jiffies_to_timespec(unsigned long jiffies, struct timespec *value)
    {
            value->tv_nsec = (jiffies % HZ) * (1000000000L / HZ);
            value->tv_sec = jiffies / HZ;
    }

注意:我在版本2.4.22中检查了此信息。

答案 2 :(得分:5)

我在kernelnewbies上找到了此示例代码。请务必与-lrt

相关联
#include <unistd.h>
#include <time.h>
#include <stdio.h>

int main()
{
    struct timespec res;
    double resolution;

    printf("UserHZ   %ld\n", sysconf(_SC_CLK_TCK));

    clock_getres(CLOCK_REALTIME, &res);
    resolution = res.tv_sec + (((double)res.tv_nsec)/1.0e9);

    printf("SystemHZ %ld\n", (unsigned long)(1/resolution + 0.5));
    return 0;
 }

答案 3 :(得分:1)

使用CLI获取USER_HZ值(请参阅接受答案下的注释):

getconf CLK_TCK