工作佇列
工作佇列由核心執行緒執行,在程序上下文中執行。
工作佇列允許重新排程甚至是睡眠
在工作佇列和軟中斷/tasklet中做出選擇非常容易。如果推後執行的任務需要睡眠,就選擇工作佇列。不需要睡眠,就選擇軟中斷或tasklet
唯一能在程序上下文中執行、睡眠的下半部機制。在需要獲得大量記憶體、需要獲取訊號量、需要執行阻塞式的i/o操作時,工作佇列會非常有用。
工作佇列的實現
工作者執行緒:建立的核心執行緒負責執行由核心其他部分排到佇列裡的任務
預設的工作者執行緒叫做events/n,這裡的n是處理器編號
表示執行緒的資料結構
工作者執行緒用workqueue_struct結構標識
struct workqueue_struct
每個處理器,每個工作者執行緒對應乙個cpu_workqueue_struct結構體。
struct cpu_workqueue_struct
工作用work_struct結構體表示
struct work_struct{
atomic_long_t data;
struct list_head entry;
work_fun_t func;
使用工作佇列
預設的events工作佇列
建立推後的工作:
編譯時靜態建立 declare_work(name, void (*func) (void *), void *data);
動態建立 init_work(struct work_struct *work, void (*func) (void *), void *data);
工作佇列處理函式:
void work_handler(void *data)
對工作進行排程:
schedule_work(&work);
schedule_delayed_work(&work, delay);
void flush_scheduled_work(void);
函式會一直等待,知道佇列中的所有物件都被執行才返回。該函式不取消任何延遲執行的工作。取消延遲執行工作應呼叫:
int cancel_delayed_work(struct work_struct *work);
建立新的工作佇列
建立自己的工作佇列
struct workqueue_struct *create_workqueue(const char *name);
對工作進行排程
int queue_work(struct workqueue_struct *wq, struct work_struct *work)
int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)
重新整理指定佇列
flush_workqueue(struct workqueue_struct *wq);
工作佇列分析
一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...
工作佇列模型
workqueue,中文稱其為工作佇列,是乙個用於建立核心執行緒的介面,通過它建立的核心執行緒來執行核心其他模組排列到佇列裡的工作,建立的核心執行緒被稱為工作者執行緒。要理解工作佇列的實現,重點在於理解相關的三個資料結構的含義及關係。1 表示工作佇列型別的資料結構 struct workqueue ...
工作佇列分析
一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...