linux中斷控制之工作佇列

2021-06-12 11:01:08 字數 2704 閱讀 8186

工作佇列是將工作推後執行的一種機制,並且可以睡眠。

工作佇列結構

定義於#include核心3.1.4  原始碼位於kernel/workqueue.c

先看工作佇列結構

struct work_struct ;

data的型別是atomic_long_t,只是個原子型別,相當於老版核心中的pending和wq_data的複合體。

entry迴圈鍊錶結構。

func的引數是work_struct指標,typedef void (*work_func_t)(struct work_struct *work)。

1.怎麼把使用者的資料作為引數傳遞給func呢?

與老版2.6.19不同,老版的有定義void* data作為傳遞引數,而這裡是通過container_of來得到使用者資料

2.如何延時操作?

老版2.6.19以前有定義timer,這裡定義了新的結構delayed_work

struct delayed_work ;

建立工作佇列

#definecreate_workqueue(name)

\ alloc_workqueue((name), wq_mem_reclaim, 1)

#define create_freezable_workqueue(name)

\alloc_workqueue((name), wq_freezable | wq_unbound | wq_mem_reclaim, 1)

#define create_singlethread_workqueue(name)

\alloc_workqueue((name), wq_unbound | wq_mem_reclaim, 1)

建立工作

#define declare_work(n, f)

\ struct work_struct n = __work_initializer(n, f)

#define __work_initializer(n, f) ,

\ .func = (f),

\ __work_init_lockdep_map(#n, &(n))

\ }

定義名為n的work_struct型別變數,func是work_func_t型別

#defineinit_work(_work, _func)

\ do while (0)

#ifdef config_lockdep

#define __init_work(_work, _func, _onstack)

\do while (0)

#else

#define __init_work(_work, _func, _onstack)

\do while (0)

#endif

巨集裡面還是巨集,一層一層的展開,有興趣的可以研究下。新增work變數,首次構造該結構時使用

提交工作

intqueue_work(struct workqueue_struct *wq, struct work_struct *work)

intschedule_work(struct work_struct *work)

對於工作和工作佇列的操作,效果是一樣 其他也類似

int queue_delayed_work(struct workqueue_struct *wq,

struct delayed_work *dwork, unsigned long delay)

延時delay後才被執行

取消工作

bool cancel_delayed_work_sync(struct delayed_work *dwork)

void flush_workqueue(struct workqueue_struct *wq);

flush_workqueue並不會取消任何延遲執行的工作,因此如果要取消延遲工作,應該呼叫cancel_delayed_work_sync()。

釋放工作佇列

void destroy_workqueue(struct workqueue_struct *queue);

用例

struct my_struct_t ;

void my_func(struct work_struct *work)

struct workqueue_struct *my_wq;    //全域性變數

struct my_struct_t my_name;            //全域性變數

//初始化函式中定義

my_wq = create_workqueue(「my wq」);

my_name.name = 「william」; 

init_work(&(my_name.my_work), my_func);

queue_work(my_wq, &(my_name.my_work));

//解除安裝函式中使用

destroy_workqueue(my_wq);

軟中斷 tasklet 工作佇列

深入理解linux核心 筆記4 軟中斷 tasklet 工作佇列 2009年06月02日 星期二 10 48 軟中斷 tasklet和工作佇列並不是linux核心中一直存在的機制,而是由更早版本的核心中的 下半部 bottom half 演變而來。下半部的機制實際上包括五種,但2.6版本的核心中,下...

軟中斷 tasklet 工作佇列

軟中斷 tasklet和工作佇列並不是linux核心中一直存在的機制,而是由更早版本的核心中的 下半部 bottom half 演變而來。下半部的機制實際上包括五種,但2.6版本的核心中,下半部和任務佇列的函式都消失了,只剩下了前三者。本文重點在於介紹這三者之間的關係。函式細節將不會在本文中出現,可...

軟中斷 tasklet 工作佇列

軟中斷 1 軟中斷作為下半部機制的代表,2 是隨著smp share memory processor 的出現應運而生的 3 軟中斷是tasklet實現的基礎 tasklet實際上只是在軟中斷的基礎上新增了一定的機制 4 軟中斷一般是 可延遲函式 的總稱 5 軟中斷可以在多個cpu上並行執行 6 軟...