在我閱讀時,jiffies會在定時器ISR的每個計時器滴答聲上遞增。但是在SMP中,所有的CPU都會有自己的定時器中斷,因此它們有自己的定時器ISR。所以我的問題是:哪些cpu增加了SMP中的jiffies?
jiffies是否跨越所有CPU?如果是這樣,它的計時器ISR如何以及哪個CPU增加它?
根據我的理解,jiffies不能是每CPU,否則相同的過程時,在不同的CPU上預定將看到不同的jiffy值。
由於
在我閱讀時,jiffies會在定時器ISR的每個計時器滴答聲上遞增。但是在SMP中,所有的CPU都會有自己的定時器中斷,因此它們有自己的定時器ISR。所以我的問題是:哪些cpu增加了SMP中的jiffies?
jiffies是否跨越所有CPU?如果是這樣,它的計時器ISR如何以及哪個CPU增加它?
根據我的理解,jiffies不能是每CPU,否則相同的過程時,在不同的CPU上預定將看到不同的jiffy值。
由於
有兩個定時器中斷:
本地定時器中斷(LOC
在/proc/interrupts
)每瞬間觸發一次每個CPU上。
全局定時器中斷(中斷0)每個jiffy觸發一次,一個CPU觸發一次。它遞增jiffies
。
請注意,「Tickless Kernel」配置選項(在Linux 2.6.21,CONFIG_NO_HZ
中引入)將刪除這些中斷。如果使用無滴答的內核,則不會再有定期中斷。相反,當進程開始量子時,Linux會在硬件中設置一個「鬧鐘」,以在量子結束時觸發中斷。
看到這篇文章link。
基本上,tick_do_timer_cpu
變量保存應該運行管理jiffies的代碼的CPU ID。 jiffies管理功能的執行可以從一個內核跳轉到另一個內核,但顯然不能在同一時間在不同內核上進行更新。
CPU0 CPU1 CPU2 CPU3 0:41 19 0 8 IO-APIC邊緣計時器 @ugoren:以上是執行cat/proc的我的Ubuntu桌面上的輸出中斷0 /中斷。我仍然想知道哪個CPU正在計算哪個定時器中斷的jiffies。下面是我的cat/proc/version Linux版本3.2.0-26-generic-pae(buildd @ lamiak)(gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)) – Inder 2012-07-23 05:08:52
看起來像是處理全局定時器中斷每次使用不同的CPU。我看到它沒有問題。 – ugoren 2012-07-23 07:13:04
是的,全局定時器(中斷0)每次都由不同的CPU處理。但是如果這個計時器增加了jiffies,那麼所有CPU的計數總和應該是jiffies值。但是總數是68(41 + 19 + 0 + 8),不能是jiffies。 – Inder 2012-07-23 09:27:02