上半部與下半部

又想中斷處理程序運行得快,又想中斷處理程序完成的工作量多,這兩個目的顯然有所抵觸。鑑於兩個目的之間存在此消彼長的矛盾關係,所以我們一般把中斷處理切爲兩個部分或兩半。

中斷處理程序是上半部。接受到一箇中斷,他就立即開始執行,但只做嚴格時限的工作。例如對接受的中斷進行應答或復位硬件,這些工作都是在所有中斷被禁止的情況下完成的。能夠被允許稍後完成的工作會推遲到下半部(bottom half)去。此後,在合適的時機,下半部會被開中斷執行。Linux提供了實現下半部的各種機制。


1、"下半部"的起源

最早的Linux只提供"bottom half"這種機制用於實現下半部。這個名字在那時毫無異議,因爲但是它是將工作推後的唯一方法。這種機制也被稱爲"BH".BH接口非常簡單。他提供一個靜態創建,由32個bottom halves組成的鏈表。上半部通過一個32位整數中的一位來標示出哪個bottom half可以執行。每個BH都在全局範圍內進行同步。即使分屬於不同的處理器,也不允許任何兩個bottom half同事執行。這種機制使用方便卻不夠靈活,簡單卻有性能瓶頸。

2、任務隊列

不久,內核開發者們就引入了任務隊列(task queue)機制來實現工作的推後執行。並用它代替BH機制。內核爲此定義了一組隊列都包含一個由等待調用的函數組成鏈表。根據其所處隊列的位置,這些函數會在某個時刻執行。驅動程序可以把它們自己的下半部註冊到合適的隊列上去。這種機制表現得還不錯,但仍不夠靈活,沒法代替整個BH接口。對於一些性能要求較高的子系統,像網絡部分,它也不能勝任。

3、軟中斷和tasklet

在2.3這個開發板中,內核開發者引入了軟中斷(softirqs)和tasklet。如果無需考慮過去開發的驅動程序兼容的話,軟中斷和tasklet可以完全代替BH接口。軟中斷是一組靜態定義的下半部接口,有32個,可以在所有處理器上同時執行--即使兩個類型相同也可以。tasklet這一名稱取得很槽糕,讓人費解,他們是一種基於軟中斷實現的靈活性強,動態創建的下半部實現機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章