驅動開發筆記--workqueue

參考

工作隊列(workqueue) create_workqueue/schedule_work/queue_work

工作隊列workqueue應用

workqueue 用法實例

概述

工作隊列是另一種將工作推後執行的形式,它可以把工作交給一個內核線程去執行,這個下半部是在進程上下文中執行的,因此,它可以重新調度還有睡眠。

在2.6.36之後的內核當中對工作隊列子系統作了改變,採用的機制改變爲併發管理工作隊列機制(Concurrency Managed Workqueue (cmwq))。在原來的機制當中,當kernel需要創建一個workqueue(create_workqueue()方式)的時候,它會在每一個cpu上創建一個work_thread,爲每一個cpu分配一個struct cpu_workqueue_struct,隨着Kernel創建越來越多的workqueue,這將佔用大量的的內存資源,並且加重了進程調度的任務量。而在新的工作隊列機制中它不再在每次create_workqueue時都爲workqueue創建一個work thread,而是在系統啓動的時候給每個cpu創建一個work thread,當有任務項work_struct需要處理時,系統會將任務項work_struct交給某個處理器的work thread上去處理。

使用方法

初始化並綁定處理函數(宏定義)
DECLARE_WORK(name,work_func_t*); // 靜態
INIT_WORK(struct work_struct *work, work_func_t *);  // 靜態
工作隊列調度
static inline bool schedule_work(struct work_struct *work)
{
    return queue_work(system_wq, work);
}

簡單應用

struct work_struct mywork;
void work_handler(struct work_struct *work);  // 底半部處理函數

INIT_WORK(&mywork, work_handler);
schedule_work(&mywork); //調度工作

工作隊列擴展

默認情況下可直接採用系統工作隊列處理工作,當然也可以創建新的工作線程和工作隊列來處理工作。

struct workqueue_struct;
create_workqueue(name); // 宏定義,創建一個新的工作隊列
create_singlethread_workqueue("helloworld"); //宏定義, 創建一個單線程的工作隊列不與任何CPU綁定
int queue_work(struct workqueue_struct *wq, struct work_struct *work);   //當前CPU
int queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work);    // 指定CPU
void flush_workqueue(struct workqueue_struct *wq);  //  確保工作隊列中的工作都完成
void destroy_workqueue(struct workqueue_struct *wq);  //  銷燬工作隊列

應用

struct workqueue_struct *queue = NULL;
queue = create_workqueue("newProcess");//創建多個CPU上的工作者進程
struct work_struct mywork;
void work_handler(struct work_struct *work);  // 底半部處理函數
INIT_WORK(&mywork, work_handler); //初始化work
queue_work(queue, &mywork); // 把工作添加到當前cpu的工作隊列中
flush_workqueue(queue); //刷新
destroy_workqueue(queue);//銷燬新創建的工作者進程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章