2013-04-15 18 views

回答

5

簡單的回答是硬件時鐘中斷服務程序既沒有執行,也不是動態計時器處理程序的調度是由模式中,系統是在硬件時鐘中斷前的影響。原因是時鐘定時器中斷是立即服務的硬件中斷,無論執行是在內核還是在用戶上下文中(假設定時器中斷被啓用),以及時鐘定時器的中斷服務程序中斷本身會引發運行動態定時器處理程序的軟件中斷。

注意事項:1)實際上我沒有證實這一點。 2)這不適用於無滴內核或高分辨率定時器。

Linux內核代碼使用單詞「定時」是指幾個不同的事情:

  1. 硬件定時器或時鐘中斷,讓內核中的「滴答」
  2. 動態定時器 - 通過使用軟件定時器內核和驅動程序
  3. 間隔計時器 - (setitimer和報警系統調用)軟件定時器用於用戶模式進程

的hardwa再時鐘或計時器滴答

在在使用硬件時鐘來提供「嘀」的系統中,時鐘計時器中斷是一個體繫結構相關硬件中斷。例如,查找arch/powerpc/kernel/head_booke.h中的「timer_interrupt」,然後查看arch/powerpc/kernel/time.c中的中斷服務例程(ISR)timer_interrupt實現。無論當前的執行上下文如何,當發生定時器中斷時,此ISR立即執行。這個硬件中斷不同於其他硬件中斷,因爲當它返回時,處理不會返回到前一個上下文。相反,調度程序被輸入。

對於被設定爲每秒產生1000個時鐘中斷的系統中,有一個機會,當正被服務的其它中斷時鐘中斷有時會被屏蔽。這通常被稱爲「丟失滴答」問題。如果不補償丟失的蜱蟲,負載系統的時間感會減慢。在一些體系結構中,內核通過使用更細粒度的硬件增量計數器來補償丟失的計時器,其計數值在每個時鐘計時器中斷中被讀取和記錄。通過比較當前時間點的增量計數器值與前一個時間點的增量計數器值,內核可以確定是否丟失了時間點。

軟件定時器

動態定時器處理程序被設置在時鐘定時器中斷結束,在返回之前已經過期的動態定時器(你與linux/timer.h設置類型)的列表。序列是(大約):

[arch dependent]:timer_interrupt() 
kernel/time/tick-common.c:tick_handle_periodic() 
kernel/time/tick-common.c:tick_periodic() 
kernel/timer.c:update_process_times() 
kernel/timer.c:run_local_timers() 
kernel/softirq.c:raise_softirq(TIMER_SOFTIRQ) 

我已經省略了設置爲timer_interrupttick_handle_periodic到該處理程序,以及用於TIMER_SOFTIRQ處理程序的initialilzations。

raise_softirq(TIMER_SOFTIRQ)的調用會生成立即提供服務的軟件中斷。中斷的ISR運行動態定時器隊列。定時器處理程序在softirq上下文中運行,並啓用硬件中斷。當ISR返回時,調度程序被調用。這意味着如果設置了很多定時器,那麼運行隊列中接下來發生的任何進程都將被延遲。

如果丟失了滴答聲,那麼定時器處理程序的執行可能會延遲,但是,延遲並不取決於運行時鐘定時器中斷之前的執行競爭。

注意有關動態定時器精度

」 ...內核不能保證定時器功能將在其到期時間正確的開始。它只能確保他們無論是在適當的時間或之後執行延遲了幾百毫秒。「 瞭解Linux內核,Bovet和Cesati,第3版,O'reilly。

所以,如果你需要更好的定時器精度,你需要使用高分辨率定時器。

參考文獻:Software interrupts and realtime

+0

非常感謝Jonathan Ben-Avraham先生的回覆。現在我有另一個疑問。讓我們說在一個單處理器的linux系統中,系統正在服務一個內核中斷我的意思是系統處於中斷環境中,並且意味着計時器得到了驗證,並且那時定時器中斷了系統如何表現? – user2282621

+2

只要IRQ禁用,它就會一直等到中斷處理程序結束。 – tangrs

+1

@ user2282621:嗨,我添加了更多的細節,希望有所幫助。 –

相關問題