真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

八、下半部和推后執(zhí)行的工作-創(chuàng)新互聯(lián)

中斷處理程序的局限:八、下半部和推后執(zhí)行的工作

1、中斷處理程序以異步的方式執(zhí)行,并且它有可能會打斷其他重要代碼的執(zhí)行。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),湘西土家族企業(yè)網(wǎng)站建設(shè),湘西土家族品牌網(wǎng)站建設(shè),網(wǎng)站定制,湘西土家族網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,湘西土家族網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

2、如果當(dāng)前有一個中斷處理程序正在執(zhí)行,最好的情況是,與該中斷同級的其他中斷會被屏蔽,最壞情況下,當(dāng)前處理器上所有其他中斷都會被屏蔽。

3、中斷處理程序往往需要對硬件進(jìn)行操作,所以他們不能阻塞。這限制了他們所作的事情。

8.1 下半部

下半部的任務(wù)就是執(zhí)行與中斷處理密切相關(guān)但中斷處理程序本身不執(zhí)行的工作。中斷處理程序注定要完成一部分工作:幾乎都需要通過操作硬件對中斷的到達(dá)進(jìn)行確認(rèn),有時他還會從硬件拷貝數(shù)據(jù)。

8.1.2 下半部的環(huán)境

3、軟中斷和tasklet

軟中斷是一組靜態(tài)定義的下半部接口,有32個,可以在所有處理器上同時執(zhí)行——及時兩個類型相同也可以。

tasklet:兩個不同類型的tasklet可以在不同的處理器上同時執(zhí)行,但類型相同的tasklet不能同時執(zhí)行。軟中斷必須在靜態(tài)編譯期間就進(jìn)行注冊。如此相反,tasklet可以通過代碼動態(tài)注冊。

內(nèi)核定時器把操作推遲到某個確定的時間段之后執(zhí)行。

8.2 軟中斷

8.2.1 軟中斷的實(shí)現(xiàn)

軟中斷是在編譯期間靜態(tài)分配的。它不像tasklet那樣能被動態(tài)的注冊或注銷。軟中斷由softirq_action結(jié)構(gòu)表示。

一個軟中斷不會搶占另外一個軟中斷。唯一可以搶占軟中斷的是中斷處理程序。其他的軟中斷甚至是相同類型的軟中斷可以在其他處理器上同時執(zhí)行。

在下列地方,待處理的軟中斷會被檢查和執(zhí)行:

1、從一個硬件中斷代碼處返回時

2、在ksoftirqd內(nèi)核線程中

3、在那些顯示檢查和執(zhí)行待處理的軟中斷代碼中,如網(wǎng)絡(luò)子系統(tǒng)中

不管用什么辦法喚起,軟中斷都要在do_softirq()中執(zhí)行。

8.2.2 使用軟中斷

軟中斷保留給系統(tǒng)中對時間要求最嚴(yán)格以及最重要的下半部使用。目前,只有兩個子系統(tǒng)(網(wǎng)絡(luò)和SCSI)直接使用軟中斷。此外,內(nèi)核定時器和tasklet都是簡歷在軟中斷上的。軟中斷處理程序執(zhí)行時,允許響應(yīng)中斷,但它自己不能休眠。在一個處理程序運(yùn)行的時候,當(dāng)前處理器上的軟中斷被禁止。但其他處理器仍可以執(zhí)行別的軟中斷。如果同一個軟中斷在它被執(zhí)行的同時再次觸發(fā)了,那么另一個處理器可以同時運(yùn)行這個處理程序。這意味著任何共享數(shù)據(jù)都需要嚴(yán)格保護(hù)。因此,大部分軟中斷處理沖虛,都通過采取單處理器數(shù)據(jù)或其他一些技巧來避免枷鎖。

raise_softirq()函數(shù)可以講一個軟中斷設(shè)置為掛起狀態(tài),讓他在下次調(diào)用do_softirq()的時候投入運(yùn)行。

在中斷處理程序中觸發(fā)軟中斷是最常見的形式。在這種情況下,中斷處理程序執(zhí)行硬件設(shè)備的相關(guān)操作,然后觸發(fā)相應(yīng)的軟中斷,最后推出。內(nèi)核在執(zhí)行完中斷處理程序后會馬上執(zhí)行do_softirq()函數(shù)。

8.3 tasklet

8.3.1

因?yàn)閠asklet是通過軟中斷實(shí)現(xiàn)的,所以其本身也是軟中斷。tasklt有兩類軟中斷代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。HI_SOFTIRQ優(yōu)先執(zhí)行。

8.3.2 使用tasklet

1、聲明tasklet

靜態(tài):DECLARE_TASKLET(name,func,data);tasklet處于激活狀態(tài)

DELCARE_TASKLET_DISABLE(name,func,data);tasklet禁止?fàn)顟B(tài)

動態(tài):struct tasklet_struct my_tasklet={null,0,ATOMIC_INIT(0),my_tasklet_handler,dev)

tasklet_init(t,tasklet_handler,dev);

2、編寫tasklet處理程序

void tasklet_handler(unsigned long data)

因?yàn)槭强寇浿袛鄬?shí)現(xiàn),所以tasklet不能睡眠。不能使用阻塞式函數(shù),由于tasklet運(yùn)行時允許響應(yīng)中斷,所以必須做好預(yù)防工作。

3、調(diào)度tasklet

tasklet_schedule(&my_tasklet);

在tasklet被調(diào)度后,只要有機(jī)會就會盡可能的執(zhí)行。在它還沒有得到運(yùn)行機(jī)會之前,如果有一個相同的tasklet又被調(diào)度了,那么它仍然只能運(yùn)行一次。作為一種優(yōu)化措施,一個tasklet總在調(diào)度它的處理器上運(yùn)行——更好的利用處理器緩存。

tasklet_disable();

tasklet_disable_nosync();

tasklet_enable();

tasklet_kill();從掛起的隊(duì)列中去掉一個tasklet。如果tasklet正在執(zhí)行,該函數(shù)等待其執(zhí)行完畢后,從隊(duì)列中去掉tasklet。

4、ksoftirqd

內(nèi)核不會立即處理重新觸發(fā)的軟中斷。當(dāng)大量軟中斷出現(xiàn)后,內(nèi)核會喚醒一組內(nèi)核線程來處理這些負(fù)載。這些線程在最低優(yōu)先級上運(yùn)行(nice 19),這能避免與其他重要的任務(wù)搶奪資源。但他們最終肯定會執(zhí)行,所以這個方案能夠保證在軟中斷負(fù)擔(dān)很重的時候,用戶程序不會因?yàn)榈貌坏教幚砥鲿r間而處于饑餓狀態(tài)。相應(yīng)的,也能保證“過量”的軟中斷終究會得到處理。在空閑系統(tǒng)上,這個方案表現(xiàn)良好,軟中斷處理的非常迅速(因?yàn)閮?nèi)核線程會馬上調(diào)度)。

8.4 工作隊(duì)列

工作隊(duì)列可以把工作推后,交由一個內(nèi)核線程去執(zhí)行——這個下半部分總是會在進(jìn)程上下文中執(zhí)行。工作隊(duì)列允許重新調(diào)度和睡眠。

8.4.1 工作隊(duì)列的實(shí)現(xiàn)

工作隊(duì)列子系統(tǒng)是一個用于創(chuàng)建內(nèi)核線程的接口,通過它創(chuàng)建的進(jìn)程負(fù)責(zé)執(zhí)行由其他內(nèi)核其他部分排到隊(duì)列中的人物。它創(chuàng)建的這些內(nèi)核線程稱作工作者線程。工作隊(duì)列子系統(tǒng)提供了一個缺省的工作者線程來處理這些工作。

8.4.2 使用工作隊(duì)列

1、創(chuàng)建推后的工作

DECLARE_WORK(name,void(*func)(void*),void *data);

INIT_WORK(struct work_struct *work,void(*func)(void *),void *data);

2、工作隊(duì)列處理函數(shù)

void work_handler(void *data)

這個函數(shù)會由一個工作者線程執(zhí)行,因此,函數(shù)會運(yùn)行在進(jìn)程上下文中。默認(rèn)情況下,允許響應(yīng)中斷,并且不持有任何鎖。如果需要,函數(shù)可以睡眠。需要注意的是,盡管操作處理函數(shù)運(yùn)行在進(jìn)程上下文中,但它不能訪問用戶空間,因?yàn)閮?nèi)核線程在用戶空間沒有相關(guān)的內(nèi)存映射。通常發(fā)生在系統(tǒng)調(diào)用時,內(nèi)核會代表用戶空間的進(jìn)程運(yùn)行,此時它才能訪問用戶空間,也只有在此時它才會映射用戶空間的內(nèi)存。

3、對工作進(jìn)行調(diào)度

想要把給定的工作的處理函數(shù)提交給缺省的events工作者線程:

schedule_work(&work);

schedule_delayed_work(&work);

4、刷新操作

void flush_scheduled_work(void);

函數(shù)會一直等待,知道隊(duì)列中所有對象都被執(zhí)行以后才返回。在等待所有待處理的工作執(zhí)行的時候,該函數(shù)會進(jìn)入休眠狀態(tài),所以只能在進(jìn)程上下文使用它。

int cancel_delayed_wrok(struct work_struct *work);

5、創(chuàng)建新的工作隊(duì)列

struct workqueue_struct *create_workqueue(const char *name);

int queue_work(struct workqueue_struct *wq,struct work_struct *work);

int queue_delayed_work(struct wrokqueue_struct *wq,struct work_struct *work,unsigned long delay);

flush_workqueue(struct workqueue_struct *wq);

8.5 下半部機(jī)制的選擇

8.6 在下半部之間加鎖

使用tasklet的好處在于,他自己負(fù)責(zé)執(zhí)行的序列化保障:兩個相同的tasklet不允許同時執(zhí)行,即使在不同的處理器上也不行。

8.7 禁止下半部

一般的單純禁止下半部是不夠的,為了保證共享數(shù)據(jù)的安全,更常見的做法是,先得到一個鎖然后再禁止下半部的處理。驅(qū)動程序中通常使用的都是這種方法。

local_bh_disable();函數(shù)通過preempt_count(內(nèi)核搶占的時候使用的也是它)為每一個進(jìn)程維護(hù)一個計數(shù)器。當(dāng)計數(shù)器變?yōu)?時,下半部才能夠被處理。


網(wǎng)站標(biāo)題:八、下半部和推后執(zhí)行的工作-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/cehoci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部