1. 程式人生 > >主要的中斷下半部及其區別

主要的中斷下半部及其區別

中斷下半部主要有:軟中斷,tasklet,工作佇列

區別

1. 軟中斷和tasket是不可以睡眠的,任務佇列在程序上下問執行是可以睡眠的。

2.相同的軟中斷可以在不同的cpu上同時執行,型別相同的tasklet不可以同時執行,不同型別的軟中斷可以在不同的cpu同時執行

3.tasklet可以通過程式碼進行動態的註冊,軟中斷必須在編譯期間就進行靜態註冊。

tasklet是利用軟中斷實現的一種下半部機制,它和程序沒有關係。

ksoftirqd的出現:

軟中斷被觸發的頻率有可能很高,因為有的軟中斷處理函式還會重新觸發自己得到執行,所以就有可能造成使用者空間的程序飢餓,所以大致有3種方案

1> 只要還有被觸發的軟中斷本次就要處理完,重新觸發的軟中斷也在本次執行返回前被處理。這種方案會造成使用者空間的程序得不到執行。

2> 重新觸發的軟中斷不進行處理,它們被推到下一次軟中斷執行時去處理。這種方案雖然不讓使用者空間飢餓,但是會讓成軟中斷忍受飢餓

3> 這中方案是前兩種方案的折中,採用了ksoftirqd核心執行緒,該核心執行緒的優先順序較低,這能避免它跟其他程序搶奪cpu,另外該核心執行緒總是可以執行的。

工作佇列的出現:

工作佇列是可以睡眠的。,執行在程序上下文中

工作佇列的實現:

工作佇列的實現主要是依靠核心執行緒。

一個 workqueue_struct 表示一種核心執行緒,多種核心執行緒利用workqueue_struct結構中list_head結構體連線起來。

每一類核心執行緒對於每一次cpu有一個核心執行緒實體,每一個執行緒實體用cpu_workqueue_struct結構表示,在cpu_workqueue_sturct中work_struct 表示該執行緒實體的工作,工作(work_struct)中有相應的處理函式,通過執行相應的函式來完成處理下半部的目的