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