jiffies在內核中是一個全局變量,它用來統計系統啟動以來系統中產生的總節拍數,這個變量定義在include/Linux/jiffies.h中,定義形式如下。
unsigned long volatile jiffies;
想要理解jiffies的含義,我們需要首先理解時鍾 節拍率 節拍的概念。
一、時鍾
時鍾應用於處理器的定時信號,它使得處理器在時鍾中運行,依靠信號時鍾,處理器便知道什么時候能夠執行它的下一個功能。在linux系統中,時鍾分為硬件時鍾(又叫實時時鍾)和軟件時鍾(又叫系統時鍾)。在對內核編程中,我們經常用到的是系統時鍾,系統時鍾的主要任務有如下三點:
1.保證系統時間的正確性。
2.防止進程超額使用CPU。
3.記錄CPU和資源消耗的統計時間。
系統時鍾的初始值在系統啟動時,通過讀取硬件時鍾獲得,然后由Linux內核來維護。在系統運行中,系統時鍾的更新是根據系統啟動后的時鍾滴答數來更新的。
實時時鍾的主要作用是提供計時和產生精確的時鍾中斷。實時時鍾是用來持久存放系統時間的設備,即便系統關閉后,它也可以靠主板上的微型電池提供的電力保持系統的計時。
二、節拍率
節拍率其實就是系統定時器產生中斷的頻率,所謂頻率即指中斷每秒鍾產生多少次,即Hz(赫茲)。不同的體系結構的系統而言,節拍率不一定相同。
節拍率(Hz)的值可以在文件include/asm-x86/param.h中看到,定義如下。
#define Hz 1000
三、節拍
節拍就是指系統中連續兩次時鍾中斷的間隔時間,該值等於節拍率分之一,即1/Hz。因為系統再啟動時已經設置了Hz,所以系統的節拍也可以確定。內核正是利用節拍來計算系統時鍾和系統運行時間的。
三、jiffies變量
jiffies用來統計系統啟動以來系統中產生的總節拍數。該變量在系統啟動時被初始化為0,接下來沒進行一次時鍾中斷,jiffies自動加1。因此,知道了總的節拍數,然后再除以Hz,即可知系統的運行時間(jiffies/Hz)。
對於jiffies+Hz的含義,jiffies表示當前的系統時鍾中斷數,Hz表示一秒后的時鍾中斷的增加量,假設time=jiffies+Hz,正如上面所說 ,內核正是利用節拍數來計算系統時鍾和系統運行時間的,則通過jiffies+Hz即可間接表示一秒鍾。
如果系統中某個程序運行一段時間后,需要比較該運行時間是否超過一秒,即可通過比較time和程序運行后的jiffies值來判斷是否超過一秒。當然此時,我們需要考慮jiffies變量的回繞問題,不可直接用if(time > jiffies)來比較,linux系統提供了4個宏定義來解決用戶空間利用jiffies變量進行時間比較時可能產生的回繞現象,如下所示:
time_before()
time_after()
