工作佇列是將工作推後執行的一種機制,並且可以睡眠。
工作佇列結構
定義於#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 軟...