LKD 工作佇列

2021-09-26 10:50:29 字數 1485 閱讀 1426

工作佇列

工作佇列由核心執行緒執行,在程序上下文中執行。

工作佇列允許重新排程甚至是睡眠

在工作佇列和軟中斷/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...