《LINUX教學(xué):Linux中的中斷處理方法》要點(diǎn):
本文介紹了LINUX教學(xué):Linux中的中斷處理方法,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
1:中斷處理是必要注意的幾點(diǎn)
(1)在中斷上下文中,不能和用戶空間數(shù)據(jù)交互,也便是不能使用copy_to_user()和copy_from_user().
(2)中斷上下文中,不克不及交出CPU(不克不及休眠、不克不及schedule、不克不及被打斷).
(3)ISR運(yùn)行時(shí)間盡可能短,越長則系統(tǒng)響應(yīng)特性越差,為了節(jié)省中斷運(yùn)行的時(shí)間,所以內(nèi)核采用上半部門和下半部門的方式來處理中斷.
2:中斷上下半部的兩種辦理方案
(1)為什么要分上半部(top half,又叫頂半部,上半部門負(fù)責(zé)登記和記錄中斷,并激活下半部,讓下半部得以執(zhí)行)和下半部(bottom half,又叫底半部,下半部門主要負(fù)責(zé)真正的處理).
(2)下半部處置策略1:tasklet(小任務(wù)).
引入tasklet,最主要的是考慮支持SMP,提高SMP多個(gè)cpu的利用率;不同的tasklet可以在不同的cpu上運(yùn)行.但是tasklet屬于中斷上下文,因此不能被阻塞,不能睡眠,弗成被打斷.
(3)下半部處置策略2:workqueue(工作隊(duì)列).
workqueue的突出特點(diǎn)是下半部會(huì)交給worker thead,因此下半部處于進(jìn)程上下文,可以被重新調(diào)劑,可以阻塞,也可以睡眠.workqueue的初始化方式有靜態(tài)和動(dòng)態(tài)兩種.
靜態(tài)初始化:
挪用宏DECLARE_WORK,初始化一個(gè)中斷的上半部,然后在中斷上半部挪用schedule_work()啟動(dòng)我們的中斷下半部
動(dòng)態(tài)初始化
挪用宏 INIT_WORK,初始化一個(gè)中斷的上半部,然后在中斷上半部挪用queue_work()啟動(dòng)我們的中斷下半部
簡單地說,一般的驅(qū)動(dòng)程序的編寫者需要做兩個(gè)選擇. 首先,你是不是需要一個(gè)可調(diào)度的實(shí)體來執(zhí)行需要推后完成的工作――從根本上來說,有休眠的需要嗎?要是有,工作隊(duì)列就是你的惟一選擇. 否則最好用tasklet.要是必需專注于性能的提高,那么就考慮softirq.
3:中斷上下半部處置原則
(1)必須立即進(jìn)行緊急處理的極少量任務(wù)放入在中斷的頂半部中,此時(shí)屏蔽了與本身同類型的中斷,由于任務(wù)量少,所以可以迅速不受打擾地處理完緊急任務(wù).也就是要把執(zhí)行時(shí)間短,緊急的任務(wù)放在上半部.
(2)需要較少時(shí)間的中等數(shù)量的急迫任務(wù)放在tasklet中.此時(shí)不會(huì)屏蔽任何中斷(包含與自己的頂半部同類型的中斷),所以不影響頂半部對(duì)緊急事務(wù)的處理;同時(shí)又不會(huì)進(jìn)行用戶進(jìn)程調(diào)度,從而保證了自己急迫任務(wù)得以迅速完成.也就是說,我們?cè)谏习氩空{(diào)用task_schedule去喚醒我們的下半部時(shí),下半部并不是馬上被執(zhí)行,系統(tǒng)會(huì)根據(jù)此時(shí)的CPU的使用情況,來選擇下半部是馬上被執(zhí)行還是延時(shí)一段時(shí)間執(zhí)行,假設(shè)在延時(shí)期間產(chǎn)生了一個(gè)上半部的中斷,那么上半部就可以被先執(zhí)行.
(3)必要較多時(shí)間且并不急迫(允許被操作系統(tǒng)剝奪運(yùn)行權(quán),也就是可以被調(diào)用)的大量任務(wù)放在workqueue中.此時(shí)操作系統(tǒng)會(huì)盡量快速處理完這個(gè)任務(wù),但如果任務(wù)量太大,期間操作系統(tǒng)也會(huì)有機(jī)會(huì)調(diào)度別的用戶進(jìn)程運(yùn)行,從而保證不會(huì)因?yàn)檫@個(gè)任務(wù)必要運(yùn)行時(shí)間將其它用戶進(jìn)程無法進(jìn)行.
(4)可能引起睡眠的任務(wù)放在workqueue中.因?yàn)樵趙orkqueue中睡眠是平安的.在需要獲得大量的內(nèi)存時(shí)、在需要獲取信號(hào)量時(shí),在需要執(zhí)行阻塞式的I/O操作時(shí),用workqueue很合適.
本文永遠(yuǎn)更新鏈接地址:
維易PHP培訓(xùn)學(xué)院每天發(fā)布《LINUX教學(xué):Linux中的中斷處理方法》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9046.html