日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

softirq/tasklet/workqueue的区别

發(fā)布時間:2024/1/23 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 softirq/tasklet/workqueue的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2011年威盛Linux software的筆試題,我想了半天,就想出了工作隊列允許睡眠。。。真后悔驅(qū)動沒能深入看看

?

softirq和tasklet都屬于軟中斷,tasklet是softirq的特殊實現(xiàn);

workqueue是普通的工作隊列。

1、softirq

軟中斷支持SMP,同一個softirq可以在不同的CPU上同時運行,softirq必須是可重入的。軟中斷是在編譯期間靜態(tài)分配的,它不像tasklet那樣能被動態(tài)的注冊或去除。kernel/softirq.c中定義了一個包含32個softirq_action結(jié)構(gòu)體的數(shù)組。每個被注冊的軟中斷都占據(jù)該數(shù)組的一項。因此最多可能有32個軟中斷。2.6版本的內(nèi)核中定義了六個軟中斷:HI_SOFTIRQ、TIMER_SOFTIRQ、NET_TX_SOFTIRQ、NET_RX_SOFTIRQ、SCSI_SOFTIRQ、TASKLET_SOFTIRQ。
一般情況下,在硬件中斷處理程序后都會試圖調(diào)用do_softirq()函數(shù),每個CPU都是通過執(zhí)行這個函數(shù)來執(zhí)行軟中斷服務的。由于軟中斷不能進入硬中斷部分,且同一個CPU上軟中斷的執(zhí)行是串行的,即不允許嵌套,因此,do_softirq()函數(shù)一開始就檢查當前CPU是否已經(jīng)正出在中斷服務中,如果是則 do_softirq()函數(shù)立即返回。這是由do_softirq()函數(shù)中的 if (in_interrupt()) return; 保證的。

2、tasklet

引入tasklet,最主要的是考慮支持SMP,提高SMP多個cpu的利用率;不同的tasklet可以在不同的cpu上運行。tasklet可以理解為softirq的派生,所以它的調(diào)度時機和軟中斷一樣。對于內(nèi)核中需要延遲執(zhí)行的多數(shù)任務都可以用tasklet來完成,由于同類tasklet本身已經(jīng)進行了同步保護,所以使用tasklet比軟中斷要簡單的多,而且效率也不錯。tasklet把任務延遲到安全時間執(zhí)行的一種方式,在中斷期間運行,即使被調(diào)度多次,tasklet也只運行一次,不過tasklet可以在SMP系統(tǒng)上和其他不同的tasklet并行運行。在SMP系統(tǒng)上,tasklet還被確保在第一個調(diào)度它的CPU上運行,因為這樣可以提供更好的高速緩存行為,從而提高性能。
與一般的軟中斷不同,某一段tasklet代碼在某個時刻只能在一個CPU上運行,但不同的tasklet代碼在同一時刻可以在多個CPU上并發(fā)地執(zhí)行。Kernel/softirq.c中用tasklet_trylock()宏試圖對當前要執(zhí)行的tasklet(由指針t所指向)進行加鎖,如果加鎖成功(當前沒有任何其他CPU正在執(zhí)行這個tasklet),則用原子讀函數(shù)atomic_read()進一步判斷count成員的值。如果count為0,說明這個tasklet是允許執(zhí)行的。如果tasklet_trylock()宏加鎖不成功,或者因為當前tasklet的count值非0而不允許執(zhí)行時,我們必須將這個tasklet重新放回到當前CPU的tasklet隊列中,以留待這個CPU下次服務軟中斷向量TASKLET_SOFTIRQ時再執(zhí)行。為此進行這樣幾步操作:(1)先關 CPU中斷,以保證下面操作的原子性。(2)把這個tasklet重新放回到當前CPU的tasklet隊列的首部;(3)調(diào)用__cpu_raise_softirq()函數(shù)在當前CPU上再觸發(fā)一次軟中斷請求TASKLET_SOFTIRQ;(4)開中斷。
軟中斷和tasklet都是運行在中斷上下文中,它們與任一進程無關,沒有支持的進程完成重新調(diào)度。所以軟中斷和tasklet不能睡眠、不能阻塞,它們的代碼中不能含有導致睡眠的動作,如減少信號量、從用戶空間拷貝數(shù)據(jù)或手工分配內(nèi)存等。也正是由于它們運行在中斷上下文中,所以它們在同一個CPU上的執(zhí)行是串行的,這樣就不利于實時多媒體任務的優(yōu)先處理。

?

?

那么,什么情況下使用工作隊列,什么情況下使用tasklet。如果推后執(zhí)行的任務需要睡眠,那么就選擇工作隊列。如果推后執(zhí)行的任務不需要睡眠,那么就選擇tasklet。另外,如果需要用一個可以重新調(diào)度的實體來執(zhí)行你的下半部處理,也應該使用工作隊列。它是唯一能在進程上下文運行的下半部實現(xiàn)的機制,也只有它才可以睡眠。這意味著在需要獲得大量的內(nèi)存時、在需要獲取信號量時,在需要執(zhí)行阻塞式的I/O操作時,它都會非常有用。如果不需要用一個內(nèi)核線程來推后執(zhí)行工作,那么就考慮使用tasklet。

總結(jié)

以上是生活随笔為你收集整理的softirq/tasklet/workqueue的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。