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
沒有留言:
張貼留言