2013-08-24 48 views
10

在ULK的第5章筆者狀態如下:每個中斷處理程序都需要自旋鎖嗎?

」 ......每個中斷處理程序序列化相對於本身,也就是說,它不能執行多個併發因此,訪問數據結構。不需要同步原語「

我不明白爲什麼中斷處理程序在具有多個內核的現代CPU上」串行化「。我想可能同一個ISR可以同時在不同的內核上運行,對吧?如果是這樣的話,如果你不使用自旋鎖來保護你的數據,它可能會出現競爭狀態。

所以,現代系統與多個CPU上,每一箇中斷處理你會寫會讀&寫一些數據,是自旋鎖總是需要我的問題?

回答

7

執行中斷處理程序時,內核明確地禁止中斷控制器中的特定中斷線,因此一箇中斷處理程序不能同時執行多次。如果關鍵數據的B/W的中斷處理程序和您的過程(可能是一個內核線程)共享(的其他中斷處理程序可以同時運行,雖然)。

+0

我認爲,它只會對執行該處理程序的CPU禁止中斷,但對其他CPU禁止該中斷。是對的嗎? – Eugene

+1

它在中斷控制器上禁止中斷線本身。在同一CPU上的其他*中斷是否被禁用是體系結構特定的。 –

-1

,那麼你需要保護你的數據,因此自旋鎖是必需的。自旋鎖的常見內核API是:spin_lock()。 這些api也有變體,例如spin_lock_irqsave(),它可以幫助避免了同時獲得一個可能面臨的僵局問題/保持自旋locks.Please經過以下鏈接找到對象的細節: http://www.linuxjournal.com/article/5833

+0

-1:要麼解釋爲什麼在這裏需要'spin_lock_irqsave',或者放棄它。無論如何,它並不回答這個問題。 –

4

澄清:根據CL。下面的註釋 - 內核確保不會觸發中斷處理程序爲相同的中斷但是如果您有多個註冊中的相同中斷處理程序多箇中斷比下面的答案是,我相信是正確的。

你是對的,相同的中斷處理程序可以在多個核心上同時運行,並且共享數據需要被保護。然而,自旋鎖不是唯一的,當然也不總是推薦的方法。

許多其他同步方法(從每個CPU數據),只使用原子操作訪問共享數據,甚至讀取 - 複製 - 更新變體可用於保護共享數據。

+2

這是錯誤的;內核明確地阻止相同的中斷處理程序在多個內核上同時運行。當僅從中斷處理程序訪問數據*時,僅當不同處理程序共享相同數據時才需要鎖定。 ULK是正確的;和[LDD](http://lwn.net/Kernel/LDD3/)是正確的(「你將永遠不會看到兩個處理器同時處理相同的IRQ」,第10章)。 –

+0

@CL。我可能解析了這個問題,但我認爲他是在不同的內核上詢問相同的中斷*處理程序*,而不是針對相同的中斷。 我知道內核阻塞了中斷線,但是AFAIK明白沒有什麼能夠阻止同一個中斷處理程序被多次註冊,如果它被註冊來處理不同的中斷。 – gby

+0

@gby明白了你的觀點。謝謝! – Jun

0

中斷處理程序中不總是需要自旋鎖。

請首先注意一件事 - 當中斷控制器上發生特定設備的中斷時,該中斷在中斷控制器處因此在該特定設備的所有內核中被禁用。所以,同一個設備的中斷不能同時出現在所有的CPU上。 所以在正常情況下,不會因爲代碼不可重入而需要任何自旋鎖。

儘管在中斷處理程序中需要使用哪種自旋鎖,但有兩種情況。

  1. 請注意,當中斷來自設備和IRQ線,即內核禁用該內核的所有其它中斷,也爲其他核心也該設備中斷。來自其他設備的中斷可能會在其他內核中出現。

因此,可能出現這樣的情況,其中針對不同設備註冊了相同的中斷處理程序。例如: request_irq(A,func,..); reqest_irq(B,func,..);用於設備的 調用中斷處理函數func。設備B的 調用相同的中斷處理函數func。 因此,在這種情況下應該使用自旋鎖來防止升高狀況。

  1. 當在中斷處理程序中使用相同的資源時,還有一些在進程上下文中運行的其他代碼。 例如: - 有資源A 因此,可能會出現這樣的情況:一個內核在中斷模式下運行,中斷處理程序正在修改資源A和其他核心在進程上下文中運行,並且也在修改某些資源其他地方。 因此,爲了呈現該資源的提升條件,我們應該使用自旋鎖。
相關問題