欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

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

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久