如何在Linux中手動將jiffies轉換爲毫秒,反之亦然?我知道內核2.6有一個函數,但我正在研究2.4(作業),儘管我看了代碼,它使用了很多宏常量,我不知道它們是否在2.4中定義。將jiffies轉換爲毫秒
回答
正如前面的回答所說,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 */
你不應該指望什麼比精確到毫秒更好。
是否有可能獲得與使用CLI HZ值?例如。在2.6內核的/ proc/[pid]/stat中讀取utime後,我可以輕鬆將其轉換爲秒,而無需從C代碼編譯它嗎? – 2014-05-26 19:17:13
如果你從用戶空間HZ交互,使用USER_HZ代替。 「人7時」說,使用的sysconf(_SC_CLK_TCK)獲取該值。 – 2014-09-11 17:55:48
我從shell腳本中看不到一個明顯的方法,但它通常是一個常量,除非您對內核做了不自然的事情。在x86上USER_HZ是100。 – 2014-09-11 18:01:52
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_jiffies
和jiffies_to_timespec
在那裏你可以來回轉換一個struct timespec
和jiffies
之間:
#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版本的信息。
^以提醒我們硬編碼的jiffies。 – PypeBros 2011-09-05 13:52:18
Answer to #3875801也可以是revelant
我發現這個示例代碼上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;
}
- 1. 將jiffies轉換爲秒
- 2. 將毫秒轉換爲毫秒
- 3. 將DateTime轉換爲毫秒
- 4. 將毫秒轉換爲time_t
- 5. 將Ecto.DateTime轉換爲毫秒
- 6. 比較jiffies和毫秒
- 7. 將時間轉換爲秒+毫秒秒
- 8. Haskell:將UTCTime轉換爲秒和毫秒
- 9. 將毫秒轉換爲日期和日期爲毫秒
- 10. 將msec轉換爲jiffies
- 11. PHP將毫秒數轉換爲特定毫秒失敗(1425318722000)
- 12. 如何在毫秒中將時間戳轉換爲毫秒
- 13. 在毫秒中將毫秒轉換爲日期時間
- 14. 轉換時間爲毫秒?
- 15. 將2倍轉換爲毫秒之差?
- 16. 將ULARGE_INTEGER QuadPart轉換爲毫秒
- 17. 如何將毫秒數轉換爲DateTime?
- 18. 將毫秒轉換爲時間
- 19. 將毫秒轉換爲時間碼
- 20. 如何將毫秒數轉換爲
- 21. 將毫秒轉換爲日期/時間
- 22. SQL將時間轉換爲毫秒
- 23. SQLite將毫秒轉換爲HH:MM:SS
- 24. 將毫秒數值轉換爲日期?
- 25. 將毫秒轉換爲分鐘
- 26. 將日期轉換爲毫秒
- 27. php:將毫秒轉換爲日期
- 28. 將時間變量轉換爲毫秒
- 29. 將ntp小時轉換爲毫秒
- 30. 將分鐘轉換爲毫秒Java/android
什麼是內核2.6中使用的功能? – 2010-07-13 12:10:28
@kaciula請參閱include/linux/jiffies.h中的jiffies_to_msecs() – tonylo 2010-08-05 16:09:11