1. 程式人生 > >對linux核心中jiffies+Hz表示一秒鐘的理解

對linux核心中jiffies+Hz表示一秒鐘的理解

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變數進行時間比較時可能產生的迴繞現象,如下所示:

#define time_after(unknown,known) ((long)(known)-(long)(unknown)<0)
<pre name="code" class="cpp">#define time_before(unknown,known) ((long)(unknown)-(long)(known)<0)
#define time_after_eq(unknown,known) ((long)(unknown)-(long)(unknown)<=0)
#define time_before_eq(unknown,known) ((long)(unknown)-(long)(known)<=0)