[記錄]中斷下半部區別

linux kernel已經把中斷處理分成了top half和bottom half,看起來已經不錯了,那爲何還要提供softirq、tasklet和workqueue這些bottom half機制
workqueue和softirq、tasklet有本質的區別:
workqueue運行在process context
softirq和tasklet運行在interrupt context

tasklet是串行執行
softirq 同一類型的有可能在不同的CPU上併發執行 網卡驅動

“越快越好型”有兩種,softirq和tasklet,“隨遇而安型”也有兩種,workqueue和threaded irq handler

因此,出現workqueue是不奇怪的,在有sleep需求的場景中,defering task必須延遲到kernel thread中執行,也就是說必須使用workqueue機制。softirq和tasklet是怎麼回事呢?從本質上將,bottom half機制的設計有兩方面的需求,一個是性能,一個是易用性。設計一個通用的bottom half機制來滿足這兩個需求非常的困難,因此,內核提供了softirq和tasklet兩種機制。softirq更傾向於性能,而tasklet更傾向於易用性。
1:
softirq和hardirq(就是硬件中斷啦)是對應的,因此softirq的機制可以參考hardirq對應理解,當然softirq是純軟件的,不需要硬件參與。
linux kernel中,可以使用local_irq_disable和local_irq_enable來disable和enable本CPU中斷。和硬件中斷一樣,軟中斷也可以disable,接口函數是local_bh_disable和local_bh_enable。雖然和想像的local_softirq_enable/disable有些出入,不過bh這個名字更準確反應了該接口函數的意涵,因爲local_bh_disable/enable函數就是用來disable/enable bottom half的,這裏就包括softirq和tasklet。

2:
tasklet對於softirq而言有哪些好處:
(1)tasklet可以動態分配,也可以靜態分配,數量不限。
(2)同一種tasklet在多個cpu上也不會並行執行,這使得程序員在撰寫tasklet function的時候比較方便,減少了對併發的考慮(當然損失了性能)。
有性能需求的,可以考慮併入softirq,其他的可以考慮使用workqueue來取代。Steven Rostedt試圖進行這方面的嘗試(http://lwn.net/Articles/239484/),不過這個patch始終未能進入main line。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章