国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Linux2.6中斷下半部分的三種實(shí)現(xiàn)機(jī)制---軟中斷/tasklet/工作隊(duì)列 - Ja...
軟中斷、tasklet和工作隊(duì)列并不是Linux內(nèi)核中一直存在的機(jī)制,而是由更早版本的內(nèi)核中的“下半部”(bottom half)演變而來。下半部的機(jī)制實(shí)際上包括五種,但2.6版本的內(nèi)核中,下半部和任務(wù)隊(duì)列的函數(shù)都消失了,只剩下了前三者。本文重點(diǎn)在于介紹這三者之間的關(guān)系。(函數(shù)細(xì)節(jié)將不會在本文中出現(xiàn),可以參考文獻(xiàn),點(diǎn)這里)
(1)上半部和下半部的區(qū)別
上半部指的是中斷處理程序,下半部則指的是一些雖然與中斷有相關(guān)性但是可以延后執(zhí)行的任務(wù)。舉個(gè)例子:在網(wǎng)絡(luò)傳輸中,網(wǎng)卡接收到數(shù)據(jù)包這個(gè)事件不一定需要馬上被處理,適合用下半部去實(shí)現(xiàn);但是用戶敲擊鍵盤這樣的事件就必須馬上被響應(yīng),應(yīng)該用中斷實(shí)現(xiàn)。
兩者的主要區(qū)別在于:中斷不能被相同類型的中斷打斷,而下半部依然可以被中斷打斷;中斷對于時(shí)間非常敏感,而下半部基本上都是一些可以延遲的工作。由于二者的這種區(qū)別,所以對于一個(gè)工作是放在上半部還是放在下半部去執(zhí)行,可以參考下面四條:
a)如果一個(gè)任務(wù)對時(shí)間非常敏感,將其放在中斷處理程序中執(zhí)行。
b)如果一個(gè)任務(wù)和硬件相關(guān),將其放在中斷處理程序中執(zhí)行。
c)如果一個(gè)任務(wù)要保證不被其他中斷(特別是相同的中斷)打斷,將其放在中斷處理程序中執(zhí)行。
d)其他所有任務(wù),考慮放在下半部去執(zhí)行。
(2)為什么要使用軟中斷?
軟中斷作為下半部機(jī)制的代表,是隨著SMP(share memory processor)的出現(xiàn)應(yīng)運(yùn)而生的,它也是tasklet實(shí)現(xiàn)的基礎(chǔ)(tasklet實(shí)際上只是在軟中斷的基礎(chǔ)上添加了一定的機(jī)制)。軟中斷一般是“可延遲函數(shù)”的總稱,有時(shí)候也包括了tasklet(請讀者在遇到的時(shí)候根據(jù)上下文推斷是否包含tasklet)。它的出現(xiàn)就是因?yàn)橐獫M足上面所提出的上半部和下半部的區(qū)別,使得對時(shí)間不敏感的任務(wù)延后執(zhí)行,而且可以在多個(gè)CPU上并行執(zhí)行,使得總的系統(tǒng)效率可以更高。它的特性包括:
a)產(chǎn)生后并不是馬上可以執(zhí)行,必須要等待內(nèi)核的調(diào)度才能執(zhí)行。軟中斷不能被自己打斷,只能被硬件中斷打斷(上半部)。
b)可以并發(fā)運(yùn)行在多個(gè)CPU上(即使同一類型的也可以)。所以軟中斷必須設(shè)計(jì)為可重入的函數(shù)(允許多個(gè)CPU同時(shí)操作),因此也需要使用自旋鎖來保護(hù)其數(shù)據(jù)結(jié)構(gòu)。
(3)為什么要使用tasklet?(tasklet和軟中斷的區(qū)別)
由于軟中斷必須使用可重入函數(shù),這就導(dǎo)致設(shè)計(jì)上的復(fù)雜度變高,作為設(shè)備驅(qū)動程序的開發(fā)者來說,增加了負(fù)擔(dān)。而如果某種應(yīng)用并不需要在多個(gè)CPU上并行執(zhí)行,那么軟中斷其實(shí)是沒有必要的。因此誕生了彌補(bǔ)以上兩個(gè)要求的tasklet。它具有以下特性:
a)一種特定類型的tasklet只能運(yùn)行在一個(gè)CPU上,不能并行,只能串行執(zhí)行。
b)多個(gè)不同類型的tasklet可以并行在多個(gè)CPU上。
c)軟中斷是靜態(tài)分配的,在內(nèi)核編譯好之后,就不能改變。但tasklet就靈活許多,可以在運(yùn)行時(shí)改變(比如添加模塊時(shí))。
tasklet是在兩種軟中斷類型的基礎(chǔ)上實(shí)現(xiàn)的,但是由于其特殊的實(shí)現(xiàn)機(jī)制(將在4.3節(jié)詳細(xì)介紹),所以具有了這樣不同于軟中斷的特性。而由于這種特性,所以降低了設(shè)備驅(qū)動程序開發(fā)者的負(fù)擔(dān),因此如果不需要軟中斷的并行特性,tasklet就是最好的選擇。
(4)可延遲函數(shù)(軟中斷及tasklet)的使用
一般而言,在可延遲函數(shù)上可以執(zhí)行四種操作:初始化/激活/執(zhí)行/屏蔽。屏蔽我們這里不再敘述,前三個(gè)則比較重要。下面將軟中斷和tasklet的三個(gè)步驟分別進(jìn)行對比介紹。
(4.1)初始化
初始化是指在可延遲函數(shù)準(zhǔn)備就緒之前所做的所有工作。一般包括兩個(gè)大步驟:首先是向內(nèi)核聲明這個(gè)可延遲函數(shù),以備內(nèi)核在需要的時(shí)候調(diào)用;然后就是調(diào)用相應(yīng)的初始化函數(shù),用函數(shù)指針等初始化相應(yīng)的描述符。
如果是軟中斷則在內(nèi)核初始化時(shí)進(jìn)行,其描述符定義如下:
  struct softirq_action
          {
                   void (*action)(struct softirq_action *);
                   void *data;
          };
在\kernel\softirq.c文件中包括了32個(gè)描述符的數(shù)組static struct softirq_action softirq_vec[32];但實(shí)際上只有前6個(gè)已經(jīng)被內(nèi)核注冊使用(包括tasklet使用的HI_SOFTIRQ/TASKLET_SOFTIRQ和網(wǎng)絡(luò)協(xié)議棧使用的NET_TX_SOFTIRQ/NET_RX_SOFTIRQ,還有SCSI存儲和系統(tǒng)計(jì)時(shí)器使用的兩個(gè)),剩下的可以由內(nèi)核開發(fā)者使用。需要使用函數(shù):
         void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
初始化數(shù)組中索引為nr的那個(gè)元素。需要的參數(shù)當(dāng)然就是action函數(shù)指針以及data。例如網(wǎng)絡(luò)子系統(tǒng)就通過以下兩個(gè)函數(shù)初始化軟中斷(net_tx_action/net_rx_action是兩個(gè)函數(shù)):
    open_softirq(NET_TX_SOFTIRQ,net_tx_action);
     open_softirq(NET_RX_SOFTIRQ,net_rx_action);
這樣初始化完成后實(shí)際上就完成了一個(gè)一一對應(yīng)的關(guān)系:當(dāng)內(nèi)核中產(chǎn)生到NET_TX_SOFTIRQ軟中斷之后,就會調(diào)用net_tx_action這個(gè)函數(shù)。
tasklet則可以在運(yùn)行時(shí)定義,例如加載模塊時(shí)。定義方式有兩種:
靜態(tài)聲明
DECLARE_TASKET(name, func, data)
DECLARE_TASKLET_DISABLED(name, func, data)
動態(tài)聲明
void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data)
其參數(shù)分別為描述符,需要調(diào)用的函數(shù)和此函數(shù)的參數(shù)—必須是unsigned long類型。也需要用戶自己寫一個(gè)類似net_tx_action的函數(shù)指針func。初始化最終生成的結(jié)果就是一個(gè)實(shí)際的描述符,假設(shè)為my_tasklet(將在下面用到)。
(4.2)激活
激活標(biāo)記一個(gè)可延遲函數(shù)為掛起(pending)狀態(tài),表示內(nèi)核可以調(diào)用這個(gè)可延遲函數(shù)(即使在中斷過程中也可以激活可延遲函數(shù),只不過函數(shù)不會被馬上執(zhí)行);這種情況可以類比處于TASK_RUNNING狀態(tài)的進(jìn)程,處在這個(gè)狀態(tài)的進(jìn)程只是準(zhǔn)備好了被CPU調(diào)度,但并不一定馬上就會被調(diào)度。
軟中斷使用raise_softirq()函數(shù)激活,接收的參數(shù)就是上面初始化時(shí)用到的數(shù)組索引nr。
tasklet使用tasklet_schedule()激活,該函數(shù)接受tasklet的描述符作為參數(shù),例如上面生成的my_tasklet:
tasklet_schedule(& my_tasklet)
(4.3)執(zhí)行
執(zhí)行就是內(nèi)核運(yùn)行可延遲函數(shù)的過程,但是執(zhí)行只發(fā)生在某些特定的時(shí)刻(叫做檢查點(diǎn),具體有哪些檢查點(diǎn)?詳見《深入》p.177)。
每個(gè)CPU上都有一個(gè)32位的掩碼__softirq_pending,表明此CPU上有哪些掛起(已被激活)的軟中斷。此掩碼可以用local_softirq_pending()宏獲得。所有的掛起的軟中斷需要用do_softirq()函數(shù)的一個(gè)循環(huán)來處理。
而對于tasklet,由于軟中斷初始化時(shí),就已經(jīng)通過下面的語句初始化了當(dāng)遇到TASKLET_SOFTIRQ/HI_SOFTIRQ這兩個(gè)軟中斷所需要執(zhí)行的函數(shù):
    open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
     open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
因此,這兩個(gè)軟中斷是要被區(qū)別對待的。tasklet_action和tasklet_hi_action內(nèi)部實(shí)現(xiàn)就是為什么軟中斷和tasklet有不同的特性的原因(當(dāng)然也因?yàn)槎叩拿枋龇煌?,tasklet的描述符要比軟中斷的復(fù)雜,也就是說內(nèi)核設(shè)計(jì)者自己多做了一部分限制的工作而減少了驅(qū)動程序開發(fā)者的工作)。
(5)為什么要使用工作隊(duì)列work queue?(work queue和軟中斷的區(qū)別)
上面我們介紹的可延遲函數(shù)運(yùn)行在中斷上下文中(軟中斷的一個(gè)檢查點(diǎn)就是do_IRQ退出的時(shí)候),于是導(dǎo)致了一些問題:軟中斷不能睡眠、不能阻塞。由于中斷上下文出于內(nèi)核態(tài),沒有進(jìn)程切換,所以如果軟中斷一旦睡眠或者阻塞,將無法退出這種狀態(tài),導(dǎo)致內(nèi)核會整個(gè)僵死。但可阻塞函數(shù)不能用在中斷上下文中實(shí)現(xiàn),必須要運(yùn)行在進(jìn)程上下文中,例如訪問磁盤數(shù)據(jù)塊的函數(shù)。因此,可阻塞函數(shù)不能用軟中斷來實(shí)現(xiàn)。但是它們往往又具有可延遲的特性。
因此在2.6版的內(nèi)核中出現(xiàn)了在內(nèi)核態(tài)運(yùn)行的工作隊(duì)列(替代了2.4內(nèi)核中的任務(wù)隊(duì)列)。它也具有一些可延遲函數(shù)的特點(diǎn)(需要被激活和延后執(zhí)行),但是能夠能夠在不同的進(jìn)程間切換,以完成不同的工作。

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/yylklshmyt20090217/archive/2009/12/13/4982208.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【原創(chuàng)】Linux中斷子系統(tǒng)(三)-softirq和tasklet
十四、Linux驅(qū)動程序開發(fā)(10) - 中斷
linux內(nèi)核分析筆記----中斷上半部與下半部
LINUX軟中斷處理如何與BH函數(shù)關(guān)聯(lián)的 - LINUX - 無名小卒<br>***IT十...
linux 中斷機(jī)制淺析
Linux 內(nèi)核 tasklet 機(jī)制和工作隊(duì)列
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服