星期一, 2月 14, 2011

Linux 的 Jiffies, Tick 與 HZ 筆記

Linux 的 Jiffies, Tick 與 HZ 筆記

HZ
Linux 核心每隔固定週期會發出 timer interrupt (IRQ 0),HZ 是用來定義每一秒有幾次 timer interrupts。
舉例來說,HZ為1000,代表每秒有1000次 timer interrupts。

Tick
Tick是HZ的倒數,意即timer interrupt每發生一次中斷的時間。如HZ為250時,tick為4毫秒(millisecond)。

Jiffies
Jiffies 變數的意思是:每秒鐘執行 HZ 次。

以下程式碼會等待(佔用 CPU) 3 秒鐘 (busy-looping):
unsigned long timeout = jiffies + 3 * HZ;
whilie (time_before(jiffies, timeout)) continue;

另一個比較好的等待方法如下:(會在等待三秒鐘時做其他排程的事)
unsigned long timeout = 3 * HZ;
schedule_timeout(timeout);

HZ可在編譯核心時設定,如下所示:
$ cd /usr/src/linux
$ make menuconfig
Processor type and features ---> Timer frequency (250 HZ) --->
在 x86 平台上,kernel 2.4 HZ 預設為 100,kernel 2.6 HZ 預設為 1000,然而在 kernel 2.6.13 之後,HZ又改為預設 250。
在 ARM 平台上,kernel 2.6 中該值一般設成 100。

觀察/proc/interrupt的timer中斷次數,並於一秒後再次觀察其值。理論上,兩者應該相差250左右。
$ cat /proc/interrupts | grep timer && sleep 1 && cat /proc/interrupts | grep timer
0:        146    XT-PIC-XT        timer
LOC:     398006   Local timer interrupts
0:        146    XT-PIC-XT        timer
LOC:     398118   Local timer interrupts
上面四個欄位分別為中斷號碼、CPU中斷次數、PIC與裝置名稱。

要檢查系統上HZ的值是什麼,可執行命令:
$ cat /boot/config-`uname -r` | grep '^CONFIG_HZ='
#CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250

HZ 的設定在平台相關的 param.h 裡:
$ fgrep HZ include/asm-arm/param.h
# define HZ             CONFIG_HZ       /* Internal kernel timer frequency */
# define USER_HZ        100             /* User interfaces are in "ticks" */
# define CLOCKS_PER_SEC (USER_HZ)       /* like times() */
# define HZ             100

沒有留言: