2010-04-28 182 views
36

如何在Linux中手動將jiffies轉換爲毫秒,反之亦然?我知道內核2.6有一個函數,但我正在研究2.4(作業),儘管我看了代碼,它使用了很多宏常量,我不知道它們是否在2.4中定義。將jiffies轉換爲毫秒

+1

什麼是內核2.6中使用的功能? – 2010-07-13 12:10:28

+0

@kaciula請參閱include/linux/jiffies.h中的jiffies_to_msecs() – tonylo 2010-08-05 16:09:11

回答

37

正如前面的回答所說,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毫秒的計時器滴答的系統上,HZ/100是1,精度開始受到影響。您可能會延遲0.0001至1.999個計時器滴答時間(基本上爲0-2毫秒)。如果你試圖在10ms的tick系統上使用HZ/200,那麼整數除法給你0 jiffies!

因此,經驗法則是,使用HZ處理微小的值(接近1 jiffie)時要非常小心。

爲了其他方式轉換,你可以使用:

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

你不應該指望什麼比精確到毫秒更好。

+0

是否有可能獲得與使用CLI HZ值?例如。在2.6內核的/ proc/[pid]/stat中讀取utime後,我可以輕鬆將其轉換爲秒,而無需從C代碼編譯它嗎? – 2014-05-26 19:17:13

+1

如果你從用戶空間HZ交互,使用USER_HZ代替。 「人7時」說,使用的sysconf(_SC_CLK_TCK)獲取該值。 – 2014-09-11 17:55:48

+1

我從shell腳本中看不到一個明顯的方法,但它通常是一個常量,除非您對內核做了不自然的事情。在x86上USER_HZ是100。 – 2014-09-11 18:01:52

13

Jiffies在Linux 2.4中是硬編碼的。檢查HZ的定義,該定義在架構特定的param.h中定義。它通常爲100赫茲,每10秒一個(1秒/ 100個滴答* 1000毫秒/秒)。

這適用於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版本的信息。

+0

^以提醒我們硬編碼的jiffies。 – PypeBros 2011-09-05 13:52:18

4

我發現這個示例代碼上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; 
}