chp7下半段和推后執(zhí)行的工作_第1頁
chp7下半段和推后執(zhí)行的工作_第2頁
chp7下半段和推后執(zhí)行的工作_第3頁
chp7下半段和推后執(zhí)行的工作_第4頁
chp7下半段和推后執(zhí)行的工作_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章下半段和推后執(zhí)行的工作下半部下半部的任務(wù)主要是執(zhí)行與中斷相關(guān)的工作,這些工作沒有被中斷服務(wù)程序本身完成.主進(jìn)程中斷topbottom1.與時間相關(guān)的工作2.與硬件相關(guān)的工作3.不希望被其他中斷打斷其他工作歷史最初的機(jī)制:BH2.5內(nèi)核后被廢止任務(wù)隊(duì)列2.5內(nèi)核之后被工作隊(duì)列替代2.3內(nèi)核引入軟中斷(softirq)和tasklet32個軟中斷,實(shí)際上只用到6個tasklet實(shí)現(xiàn)于軟中斷之上2.5內(nèi)核引入工作隊(duì)列為什么要把中斷分為兩部分中斷服務(wù)程序異步執(zhí)行,可能會中斷其他的重要代碼,包括其他中斷服務(wù)程序。因此,為了避免被中斷的代碼延遲太長的時間,中斷服務(wù)程序需要盡快運(yùn)行.希望限制中斷服務(wù)程序所做的工作,因此處理中斷的時間越短越好。中斷服務(wù)程序只作必須的工作,其他的工作推遲到以后處理。2.6內(nèi)核的三種方法:softirqs,tasklet,和workqueue軟中斷Softirqskernel/softirq.c定義了一個32個元素的結(jié)構(gòu)數(shù)組/*本結(jié)構(gòu)代表了一個軟中斷項(xiàng)*/structsoftirq_action{void(*sction)(structsoftirq_action*);/*帶執(zhí)行的函數(shù)*/void*data;/*傳給函數(shù)的指針*/}固定–登記的softirqs最大數(shù)目不能動態(tài)改變.工作時允許中斷.一個softirq不能搶占另一個。它只能被中斷服務(wù)程序搶占.另一個softirq,甚至是同一個可運(yùn)行于另一個CPU.使用軟中斷分配索引注冊處理程序open_softirq(索引號,處理程序,NULL)觸發(fā)軟中斷raise_softirq(索引號)softirq_pending(CPU)宏:返回指定CPU上未處理的軟中斷軟中斷優(yōu)先級Softirq描述HI_SOFTIRQ0優(yōu)先級最高的taskletsTIMER_SOFTIRQ1定時器的下半部NET_TX_SOFTIRQ2發(fā)送網(wǎng)絡(luò)數(shù)據(jù)報NET_RX_SOFTIRQ3接受網(wǎng)絡(luò)數(shù)據(jù)報SCSI_SOFTIRQ4SCSI的下半部TASKLET_SOFTIRQ5TaskletsTasklet的類型Tasklet優(yōu)先級Softirq描述HI_SOFTIRQ0優(yōu)先級最高的taskletsTIMER_SOFTIRQ1定時器的下半部NET_TX_SOFTIRQ2發(fā)送網(wǎng)絡(luò)數(shù)據(jù)報NET_RX_SOFTIRQ3接受網(wǎng)絡(luò)數(shù)據(jù)報SCSI_SOFTIRQ4SCSI的下半部TASKLET_SOFTIRQ5TaskletsTasklets的結(jié)構(gòu)structtasklet_struct{ structtasklet_struct*next; unsignedlongstate;//見下 atomic_tcount;/*referencecount鎖*/ void(*func)(unsignedlong);/*tasklet處理函數(shù)*/ unsignedlongdata;/*tasklet處理函數(shù)的參數(shù)*/};File:include\interrupt.hEnum{ TASKLET_STATE_SCHED, /*Tasklet已被調(diào)度*/ TASKLET_STATE_RUN /*Tasklet正在運(yùn)行(只用于SMP)*/};TaskletsTasklets實(shí)現(xiàn)于softirq之上,實(shí)際上也是softirqs.Tasklet同時只運(yùn)行于一個CPU.

注:softirq,甚至是同一個可運(yùn)行于另一個CPU.不同的tasklets可同時運(yùn)行于不同的CPU.tasklet_schedule()的調(diào)度過程檢查tasklet的狀態(tài)是否為TASKLET_STATE_SCHED,如果是,則立即返回;保存中斷狀態(tài),禁止本地中斷;把需要調(diào)度的tasklet指定處理器的tasklet_vec或tasklet_hi_vec鏈表;喚起TASKLET_SOFTIRQ或HI_SORTIRQ軟中斷,這樣在下一次調(diào)用do_softirq()時會執(zhí)行該tasklet;恢復(fù)中斷到原狀態(tài)并返回。tasklet處理過程禁止中斷,取當(dāng)前處理器的tasklet_vec或tasklet_hi_vec鏈表;將當(dāng)前處理器的這兩個鏈表清空;允許響應(yīng)中斷;循環(huán)遍歷鏈表上的每一個待處理的tasklet;如果是多處理器系統(tǒng),則檢查TASKLET_STATE_RUN標(biāo)志判斷這個tasklet是否在其他處理器上運(yùn)行,如果在運(yùn)行,則跳轉(zhuǎn)掉下一個tasklet,否則置其狀態(tài)為TASKLET_STATE_RUN;檢查tasklet是否被禁止(count=0),如果被禁止則跳到下一個tasklet;執(zhí)行tasklet程序;執(zhí)行完畢后,清除TASKLET_STATE_RUN標(biāo)志;重復(fù)下一個tasklet;直到所有的tasklet處理完。使用tasklet編寫tasklet處理函數(shù)voidmy_tasklet_fun(unsignedlongdata)聲明tasklet靜態(tài)

DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);動態(tài)tasklet_init(t,tasklet_handler,dev)調(diào)度

tasklettasklet_schedule(&my_tasklet)登記my_tasklet,然后允許系統(tǒng)在合適的時間調(diào)度它。軟中斷處理的時機(jī)中斷處理結(jié)束時內(nèi)核線程ksoftirqd在系統(tǒng)空閑時(每一個處理器有一個這樣的線程)內(nèi)核代碼中其他調(diào)用do_softirq函數(shù)時工作隊(duì)列Workqueue將工作推遲給一個內(nèi)核線程–work總是運(yùn)行于進(jìn)程上下文.如果推遲的工作需要睡眠,則使用workqueues。否則使用softirq或tasklets.Workqueues適用于需要分配大量的內(nèi)存,獲得一個信號量,或者執(zhí)行阻塞的I/O的情況.工作者線程每個工作者線程一個structworkqueue_struct{ structcpu_workqueue_structcpu_wq[NR_CPUS]; constchar*name;//工作者線程的名字 structlist_headlist;//指向其他工作者線程};工作者線程系統(tǒng)中每一個CPU有一個默認(rèn)的工作者線程events/n,n是處理器編號。也可自己在創(chuàng)建新的工作者線程工作者線程是一個內(nèi)核線程,當(dāng)有工作被插入到工作隊(duì)列時,被喚醒,執(zhí)行這些工作;沒有工作時睡眠工作者線程的主要流程循環(huán)執(zhí)行:線程將自己設(shè)置為睡眠態(tài),等待有工作加入隊(duì)列;如果工作隊(duì)列空,睡眠否則線程執(zhí)行循環(huán)執(zhí)行推遲的工作偽代碼見教材88頁工作的執(zhí)行過程循環(huán)執(zhí)行:鏈表非空時,取下一個工作獲取要執(zhí)行的函數(shù)及參數(shù)將工作從鏈表中摘除,將pending標(biāo)志請0調(diào)用函數(shù)重復(fù)執(zhí)行偽代碼見教材88-89頁工作者隊(duì)列每個CPU一個structcpu_workqueue_struct{ spinlock_tlock;/*互斥鎖*/ longremove_sequence;/*least-recentlyadded(nexttorun)*/ longinsert_sequence;/*nexttoadd*/ structlist_headworklist;/*工作列表*/ wait_queue_head_tmore_work; wait_queue_head_twork_done; structworkqueue_struct*wq;/*相關(guān)的workqueue_struct*/ task_t*thread;/*相關(guān)的線程*/ intrun_depth;/*run_workqueue()recursiondepth*/};工作structwork_struct{ unsignedlongpending;/*工作是否等待處理*/ structlist_headentry;/*所有工作*/ void(*func)(void*);/*處理函數(shù)*/ void*data;/*處理函數(shù)的參數(shù)*/ void*wq_data;/*內(nèi)部使用*/ structtimer_listtimer;/*推遲的工作的定時器*/};WorkQueue數(shù)據(jù)結(jié)構(gòu)workerthreadwork_structcpu_workqueue_struct1/CPUworkqueue_struct1/threadtypework_structwork_struct1/deferrablefunction使用WorkqueuesWorkqueues非常易于使用!創(chuàng)建WorkStaticDECLARE_WORK(name,void(*function)(viod*),void*data);調(diào)度Workschedule_work(&work)schedule_delayed_work(&work,delay)刷新Workvoidflush_scheduled_work(void)取消

Workintcancel_delayed_work(structwork_struct*work)應(yīng)當(dāng)使用哪一種bottomh

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論