Linux下半部分機制 工作佇列

2021-06-07 05:13:27 字數 1360 閱讀 2311

當我們編寫裝置中斷,必須要編寫中斷處理程式。中斷處理程式有些特點:

1.關閉中斷情況下執行,這樣當負載很重時,影響系統效能。

2.中斷處理程式中,不能進行睡眠。

對於中斷處理程式限制,造就必須解決問題。解決方案把中斷處理分為兩部分上半部分和下半部分。上半部分就是執行中斷處理程式。下半部分就是突破上述限制。目前下半部分實現機制有如下幾種: 軟中斷,tasklet,工作佇列,首先分析工作佇列。

中斷處理程式分為上半部分和下半部分,有時感覺十分抽象。實際就是把乙個函式拆分為兩個函式,(上半部分)中斷處理函式irq_hander,下半部分函式myworkqueue()。那麼下半部分函式有誰呼叫,什麼時候呼叫呢?

1.下半部分函式有誰呼叫哪?

建立乙個執行緒,由執行緒呼叫該函式,可見該函式是在程序上下文執行。

linux預設執行緒為:

ps -ef | grep events

root         9     2  0 15:54 ?        00:00:00 [events/0]

root        10     2  0 15:54 ?        00:00:00 [events/1]

2.什麼時候呼叫呢?

執行緒執行時,掃瞄佇列中已註冊的下半部分函式myworkqueue(),如果存在,就執行該函式。

3.實現原理

其實很簡單,每個下半部分函式,放在乙個資料結構中, 作為乙個鍊錶節點,這樣所以下半部分函式就構成乙個鍊錶,也稱之為佇列。預設執行緒掃瞄鍊錶,鍊錶不為空,意思就有註冊函式(下半部分函式),那麼執行該函式。

4.由此可見編寫下半部分非常簡單

1).標頭檔案

#include

2).資料結構

struct work_struct ;

3).靜態或者動態構建資料結構

當然使用靜態與動態,取決你自己。

靜態:declare_work(name,void(*func)(void*),void *data);

例如:static void func(struct work_struct *work);

static declare_work(work, func);//直接引用

struct work_struct work

動態:init_work(struct work_struct *work,void(*func)(void*),void *data);

例如:struct work_struct *work;//指標,間接引用

init_work(work, func);

4).註冊到鍊錶中(也就是所謂工作佇列)

int schedule_work(struct work_struct *work)

5).執行緒自動呼叫

下半部機制之工作佇列

工作佇列是一種不同於軟中斷和微執行緒的一種下半部延遲機制。工作佇列將工作延遲到乙個核心執行緒中執行,它執行在程序上下文中,它是可排程的,並且可以休眠。通常,如果延遲的工作中需要休眠,就使用工作佇列,否則使用軟中斷或微執行緒。由於核心開發者反對建立乙個新的核心執行緒,因此,應當盡量使用工作佇列,它其實...

Linux 工作佇列

工作佇列 work queue 是另外一種將工作推後執行的形式,它和tasklet有所不同。工作佇列可以把工作推後,交由乙個核心執行緒去執行,也就是說,這個下半部分可以 在程序上下文中執行。這樣,通過工作佇列執行的 能佔盡程序上下文的所有優勢。最重要的就是工作佇列允許被重新排程甚至是睡眠。那麼,什麼...

linux工作佇列

在linux核心中,對下半部 或者說推後執行的工作 的處理方式有好幾種,包括bh bottom half 軟中斷,tasklets和工作佇列等等。在2.6核心中,大名鼎鼎的bh處理被廢除,新增了更方便的工作佇列。工作佇列的方便之處在於它把工作推後,交由乙個核心執行緒去執行,這個核心執行緒總會在程序上...