工作佇列實現機制 一

2021-06-05 07:14:29 字數 2481 閱讀 8016

walle project android 2.2  and linux 2.6.32

一、工作項、工作佇列和工作者執行緒

把推後執行的任務叫做工作(work),描述它的資料結構為work_struct,這些工作以佇列結構組織成工作佇列(workqueue),其資料結構為workqueue_struct,而工作執行緒就是負責執行工作佇列中的工作。系統預設的工作者執行緒為events。

工作佇列(work queue)是另外一種將工作推後執行的形式。工作佇列可以把工作推後,交由乙個核心執行緒去執行—這個下半部分總是會在程序上下文執行,但由於是核心執行緒,其不能訪問使用者空間。最重要特點的就是工作佇列允許重新排程甚至是睡眠。

通常,在工作佇列和軟中斷/tasklet中作出選擇非常容易。可使用以下規則:

如果推後執行的任務需要睡眠,那麼只能選擇工作佇列;

如果推後執行的任務需要延時指定的時間再觸發,那麼使用工作佇列,因為其可以利用timer延時;

如果推後執行的任務需要在乙個tick之內處理,則使用軟中斷或tasklet,因為其可以搶占普通程序和核心執行緒;

如果推後執行的任務對延遲的時間沒有任何要求,則使用工作佇列,此時通常為無關緊要的任務。

實際上,工作佇列的本質就是將工作交給核心執行緒處理,因此其可以用核心執行緒替換。但是核心執行緒的建立和銷毀對程式設計者的要求較高,而工作佇列實現了核心執行緒的封裝,不易出錯,所以我們也推薦使用工作佇列。 二、

工作佇列使用

kernel/include/linux/workqueue.h

kernel/kernel/workqueue.c

要使用工作佇列,需要先建立工作項,有兩種方式:

靜態建立:

declare_work(name, function);

定義正常執行的工作項

declare_delayed_work(name, function);

定義延後執行的工作項

eg:

@ kernel/driver/input/keyboard/mt6516_kpd.c

@ mtk/src/custom/common/kernel/touchpanel/st1332/driver.c

static void kpd_switch_backlight(struct work_struct *work);

static declare_work(kpd_backlight_work, kpd_switch_backlight);

static void st1332_kpd_switch_backlight(struct delayed_work *work);

static declare_delayed_work(kpd_backlight_work,

st1332_kpd_switch_backlight);

動態建立,執行時建立:

eg:

@ kernel/driver/input/touchscreen/tspad.c

static struct work_struct work;

struct delayed_work led_work;

static void new_ts_work(struct work_struct *work);

static void s0340_ledtime_scanf(unsigned long data);

通常在probe()函式中執行下面的操作來初始化工作項:

init_work(&work, new_ts_work);

init_delayed_work(&led_work, s0340_ledtime_scanf);

工作佇列待執行的函式原型是:

typedef void (*work_func_t)(struct work_struct *work);

這個函式會由乙個工作者執行緒執行,因此,函式會執行在程序上下文中。預設情況下,

允許響應中斷,並且不持有任何鎖

。如果需要,

函式可以睡眠

。需要注意的是,儘管該函式執行在程序上下文中,但它不能訪問使用者空間,因為核心執行緒在使用者空間沒有相關的記憶體對映。通常在系統呼叫發生時,核心會代表使用者空間的程序執行,此時它才能訪問使用者空間,也只有在此時它才會對映使用者空間的記憶體。

建立了工作項之後,在適當的時候可以通過下面的兩種方式來提交工作項給工作者執行緒,通常我們使用的工作佇列和工作者執行緒都是系統初始化時候預設建立的。

schedule_work(&work);

&work馬上就會被排程,一旦其所在的處理器上的工作者執行緒被喚醒,它就會被執行。

schedule_delayed_work(&

delay_

work, delay); &

delay_

work指向的

delay_work

直到delay

指定的時鐘節拍用完以後才會執行。

eg :

schedule_delayed_work(&kpd_backlight_work, msecs_to_jiffies(300));

工作佇列 小任務機制

1.系統分配工作者執行緒 宣告結構體 struct work struct detect i2c work 初始化任務 延遲指定滴答 工作佇列的初始化 init delayed work detect i2c work,detect i2c work func 不延遲 init work delay...

工作佇列的實現

工作佇列 work queue 是另外一種將工作推後執行的形式。工作佇列可以把工作推後,交由乙個核心執行緒去執行 這個下半部分總是會在程序上下文執行。這樣,通過工作佇列執行的 能佔盡程序上下文的所有優勢。最重要的就是工作佇列允許重新排程甚至是睡眠。如果推後執行的任務需要睡眠,那麼就選擇工作佇列 如果...

下半部機制之工作佇列

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