全局變量jiffies用來記錄自系統啟動以來產生的節拍的總數。啟動時,內核將該變量初始化為0,此后,每次時鍾中斷處理程序都會增加該變量的值。一秒內時鍾中斷的次數等於Hz,所以jiffies一秒內增加的值也就是Hz。系統運行時間以秒為單位,等於jiffies/Hz。
將以秒為單位的時間轉化為jiffies:
seconds * Hz
將jiffies轉化為以秒為單位的時間:
jiffies / Hz
相比之下,內核中將秒轉換為jiffies用的多些。
硬件給內核提供一個系統定時器用以計算和管理時間,內核通過編程預設系統定時器的頻率,即節拍率(tick rate),每一個周期稱作一個tick(節拍)。Linux內核從2.5版內核開始把頻率從100調高到1000(當然帶來了很多優點,也有一些缺點).
jiffies是內核中的一個全局變量,用來記錄自系統啟動一來產生的節拍數。譬如,如果計算系統運行了多長時間,可以用 jiffies/tick rate 來計算。jiffies定義在文件<linux/jiffies.h>中:
extern unsigned long volatile jiffies;
可以利用jiffies設置超時等,譬如:
unsigned long timeout = jiffies + tick_rate * 2; // 2秒鍾后超時
if(time_before(jiffies, timeout){
// 還沒有超時
}
else{
// 已經超時
}
• jiffies的回繞wrap around
當jiffies的值超過它的最大存放范圍后就會發生溢出。對於32位無符號長整型,最大取值為(2^32)-1,即429496795。如果節拍計數達到了最大值后還要繼續增加,它的值就會回繞到0。
內核提供了四個宏來比較節拍計數,這些宏定義在文件<linux/jiffies.h>中:
time_before(unknown, known)
time_after(unknown, known)
time_before_eq(unknown, known)
time_after_eq(unknown, known)
比較的時候用這些宏可以避免jiffies由於過大造成的回繞問題。
• 用戶空間和HZ
問題提出:
在2.6以前的內核中,如果改變內核中的HZ值會給用戶空間中某些程序造成異常結果。因為內核是以節拍數/秒的形式給用戶空間導出這個值的,應用程序便依賴這個特定的HZ值。如果在內核中改變了HZ的定義值,就打破了用戶空間的常量關系---用戶空間並不知道新的HZ值。
解決方法:
內核更改所有導出的jiffies值。內核定義了USER_HZ來代表用戶空間看到的HZ值。在x86體系結構上,由於HZ值原來一直是100,所以USER_HZ值就定義為100。內核可以使用宏jiffies_to_clock_t()將一個有HZ表示的節拍計數轉換為一個由USER_HZ表示的節拍計數。
參考:
http://www.cnblogs.com/leaven/archive/2010/08/30/1812338.html
http://www.cnblogs.com/simonshi/archive/2010/12/13/1694819.html
