Thursday, January 27, 2011

Jiffies,HZ,Tick (转载)

轉: http://hi.baidu.com/yangyingchao/blog/item/bbe608873a41d726c65cc350.html

简介:
转载的文章,介绍了Linux内核中关于时钟的几个概念:HZ, tick 和 jiffies


HZ
Linux 核心每隔固定周期会发出timer interrupt (IRQ 0), HZ 是用来定义每秒timer interrupts的次数。例如, HZ为 100,代表每秒有100次timer interrupts。 HZ 可以在编译内核时设定,如下所示 (以核心版本2.6.22-1为例):
Kernel type --->   Processor type and features ---> Timer frequency (250  HZ ) --->

其中 HZ 可設定100、250、1000等值。默认为250。

测试:
利用一下命令,可以计算出HZ的近似值:
~$ cat /proc/interrupts | grep timer && sleep 1 && cat /proc/interrupts | grep timer
timer interrupt會做哪些事情? 答案如下所列:
  • 更新時間、日期與系統從開機至目前經過多少時間 。
  • 更新系統資源使用率統計
  • 檢查正在執行的程序是否已經超過其所分配的執行時間額度。如果是的話,則侵佔(preempt)該程序以利執行其它等待執行的程序。
  • 檢查軟體時間器(Software timer,如alarm系統呼叫)跟時間延遲函式(Delay function)的延遲時間是否已經超過。
Tick
Tick是 HZ 的倒数,意即timer interrupt每發发生一次的时间。如 HZ为 250,tick则为4毫秒 (millisecond)。

Jiffies
Jiffies 為 Linux 核心變數(32位元變數,unsigned long),它被用來紀錄系統自開幾以來,已經過多少的tick。每發生一次timer interrupt,Jiffies變數會被加一。值得注意的是,Jiffies於系統開機時,並非初始化成零,而是被設為-300* HZ  (arch/i386/ kernel /time.c),即代表系統於開機五分鐘後,jiffies便會溢位。那溢位怎麼辦? 事實上, Linux 核心定義幾個macro(timer_after、time_after_eq、time_before與time_before_eq),即便是溢位, 也能藉由這幾個macro正確地取得jiffies的內容。

另 外,80x86架構定義一個與jiffies相關的變數jiffies_64 ,此變數64位元,要等到此變數溢位可能要好幾百萬年。因此要等到溢位這刻發生應該很難吧。那如何經由jiffies_64取得jiffies資訊呢? 事實上,jiffies被對應至jiffies_64最低的32位元。因此,經由jiffies_64可以完全不理會溢位的問題便能取得jiffies。

No comments:

Post a Comment