中断底半部:softirq、tasklet、workqueue
為了在中斷執(zhí)行時間盡可能短和中斷處理需完成大量工作之間找到一個平衡點,Linux 將中斷處理程序分解為兩個半部:頂半部(top? half)和底半部(bottom half)。
頂半部完成盡可能少的比較緊急的功能,它往往只是簡單地讀取寄存器中的中斷狀態(tài)并清除中斷標(biāo)志后就進(jìn)行“登記中斷”的工作。“登記中斷”意味著將底半部處理程序掛到該設(shè)備的底半部執(zhí)行隊列中去。這樣,頂半部執(zhí)行的速度就會很快,可以服務(wù)更多的中斷請求。
現(xiàn)在,中斷處理工作的重心就落在了底半部的頭上,它來完成中斷事件的絕大多數(shù)任務(wù)。底半部幾乎做了中斷處理程序所有的事情,而且可以被新的中斷打斷,這也是底半部和頂半部的最大不同,因為頂半部往往被設(shè)計成不可中斷。底半部則相對來說并不是非常緊急的,而且相對比較耗時,不在硬件中斷服務(wù)程序中執(zhí)行。
a. 底半部可以被新的中斷事件打斷,這是和頂半部最大的不同,頂半部通常被設(shè)計成不可被打斷。
b. 底半部相對來說不是非常緊急的,而且相對比較耗時,不在硬件中斷服務(wù)程序中執(zhí)行。
c. 如果中斷要處理的工作本身很少,所有的工作可在頂半部全部完成。
?
盡管頂半部、底半部的結(jié)合能夠改善系統(tǒng)的響應(yīng)能力,但是,僵化地認(rèn)為 Linux設(shè)備驅(qū)動中的中斷處理一定要分兩個半部則是不對的。如果中斷要處理的工作本身很少,則完全可以直接在頂半部全部完成。
?
?
1.?軟中斷(softirq)
軟中斷(softirq)也是一種傳統(tǒng)的底半部處理機(jī)制,它的執(zhí)行時機(jī)通常是頂半部返回的時候,tasklet的基于軟中斷實現(xiàn)的,因此也運(yùn)行于軟中斷上下文。
軟中斷支持SMP,同一個softirq可以在不同的CPU上同時運(yùn)行,softirq必須是可重入的。軟中斷是在編譯期間靜態(tài)分配的,它不像tasklet那樣能被動態(tài)的注冊或去除。
軟中斷和tasklet都是運(yùn)行在中斷上下文中,它們與任一進(jìn)程無關(guān),沒有支持的進(jìn)程完成重新調(diào)度。所以軟中斷和tasklet不能睡眠、不能阻塞,它們的代碼中不能含有導(dǎo)致睡眠的動作,如減少信號量、從用戶空間拷貝數(shù)據(jù)或手工分配內(nèi)存等。也正是由于它們運(yùn)行在中斷上下文中,所以它們在同一個CPU上的執(zhí)行是串行的,這樣就不利于實時多媒體任務(wù)的優(yōu)先處理。
?
軟中斷的特性:
1).一個軟中斷不會搶占另外一個軟中斷。
2).唯一可以搶占軟中斷的是中斷處理程序。
3).其他軟中斷(包括相同類型的)可以在其他的處理其上同時執(zhí)行。
4).一個注冊的軟中斷必須在被標(biāo)記后才能執(zhí)行。
5).軟中斷不可以自己休眠(即調(diào)用可阻塞的函數(shù)或sleep等)。
6).索引號小的軟中斷在索引號大的軟中斷之前執(zhí)行
?
2.?tasklet
他的執(zhí)行上下文是軟中斷,執(zhí)行時機(jī)通常是頂半部返回的時候。?
tasklet是一種特殊的軟中斷,同一時刻一個tasklet只能在一個CPU 執(zhí)行,不同的tasklet可以在不同的CPU上執(zhí)行。這和軟中斷不同,軟中斷同一時刻可以在不同的CPU并行執(zhí)行,因此軟中斷必須考慮重入的問題。
引入tasklet,最主要的是考慮支持SMP,提高SMP多個cpu的利用率;兩個相同的tasklet決不會同時執(zhí)行。tasklet可以理解為softirq的派生,所以它的調(diào)度時機(jī)和軟中斷一樣。對于內(nèi)核中需要延遲執(zhí)行的多數(shù)任務(wù)都可以用tasklet來完成,由于同類tasklet本身已經(jīng)進(jìn)行了同步保護(hù),所以使用tasklet比軟中斷要簡單的多,而且效率也不錯。tasklet把任務(wù)延遲到安全時間執(zhí)行的一種方式,在中斷期間運(yùn)行,即使被調(diào)度多次,tasklet也只運(yùn)行一次,不過tasklet可以在SMP系統(tǒng)上和其他不同的tasklet并行運(yùn)行。在SMP系統(tǒng)上,tasklet還被確保在第一個調(diào)度它的CPU上運(yùn)行,因為這樣可以提供更好的高速緩存行為,從而提高性能。
tasklet的特性:.不允許兩個兩個相同類型的tasklet同時執(zhí)行,即使在不同的處理器上。
?
3.?工作隊列(workqueue)
工作隊列的執(zhí)行上下文是內(nèi)核線程,因此可以調(diào)度和睡眠。
如果推后執(zhí)行的任務(wù)需要睡眠,那么就選擇工作隊列。另外,如果需要用一個可以重新調(diào)度的實體來執(zhí)行你的下半部處理,也應(yīng)該使用工作隊列。它是唯一能在進(jìn)程上下文運(yùn)行的下半部實現(xiàn)的機(jī)制,也只有它才可以睡眠。這意味著在需要獲得大量的內(nèi)存時、在需要獲取信號量時,在需要執(zhí)行阻塞式的I/O操作時,它都會非常有用。
work queue造成的開銷最大,因為它要涉及到內(nèi)核線程甚至是上下文切換。這并不是說work queue的低效,但每秒鐘有數(shù)千次中斷,就像網(wǎng)絡(luò)子系統(tǒng)時常經(jīng)歷的那樣,那么采用其他的機(jī)制可能更合適一些。 盡管如此,針對大部分情況工作隊列都能提供足夠的支持。
?
工作隊列特性:
1).工作隊列會在進(jìn)程上下文中執(zhí)行
2).可以阻塞。(前兩種機(jī)制是不可以阻塞的)
3).可以被重新調(diào)度。(前兩種只可以被中斷處理程序打斷)
4).使用工作隊列的兩種形式:
?????1>缺省工作者線程(works threads)
?????2>自建的工作者線程
5).在工作隊列和內(nèi)核其他部分之間使用鎖機(jī)制就像在其他的進(jìn)程上下文一樣。
6).默認(rèn)允許響應(yīng)中斷。????????
?
4.?硬中斷、軟中斷的區(qū)別
硬中斷是外部設(shè)備低CPU的中斷,軟中斷是中斷底半部的一種處理機(jī)制。
中斷優(yōu)先級>軟中斷>任何線程。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的中断底半部:softirq、tasklet、workqueue的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么恢复备忘录删除的内容(备忘录删除了怎
- 下一篇: 桌面文件在c盘哪个文件夹(桌面在C盘里的