您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Linux內核工作隊列是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1、共享工作隊列
1)、靜態定義
宏:DECLARE_WORK(n, f)
,文件:include/linux/workqueue.h
,定義如下:
#define DECLARE_WORK(n, f) \ struct work_struct n = __WORK_INITIALIZER(n, f)
參數:
n:表示工作任務的名稱;
f:表示工作任務的實現函數;
類似接口:DECLARE_DELAYED_WORK(n, f)
,創建延時工作任務。
2)、動態定義
文件:include/linux/workqueue.h
,定義如下:
#define INIT_WORK(_work, _func) \ __INIT_WORK((_work), (_func), 0)
參數:
_work
:表示工作任務的名稱;
_func
:表示工作任務的實現函數;
2、自定義工作隊列
文件:include/linux/workqueue.h
,定義如下:
#define create_workqueue(name) \ alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name)) #define create_singlethread_workqueue(name) \ alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM, name)
參數:
name:工作隊列名稱。傳入值為字符串,和共享工作隊列里的參數不同。
返回值:工作隊列指針
工作任務定義 | 工作任務添加 | 工作任務清除 | 工作任務取消 |
---|---|---|---|
DECLARE_WORK() | schedule_work() | flush_work() | cancel_work_sync() |
DECLARE_DELAYED_WORK() | schedule_delayed_work() | flush_delayed_work() | cancel_delayed_work() cancel_delayed_work_sync() |
INIT_WORK() | schedule_work() | flush_work() | cancel_work_sync() |
INIT_DELAYED_WORK() | schedule_delayed_work() | flush_delayed_work() | cancel_delayed_work() cancel_delayed_work_sync() |
create_workqueue() | queue_work() queue_delayed_work() queue_work_on() | flush_workqueue() | destroy_workqueue() |
create_singlethread_workqueue() | queue_work() | flush_workqueue() | destroy_workqueue() |
注:
1、flush_work()
:堵塞工作任務,直到工作任務完成
2、flush_delayed_work()
:等待延時工作任務完成
3、cancel_work_sync()
:取消工作任務并等待它完成
4、cancel_delayed_work()
:取消延時工作任務
5、cancel_delayed_work_sync()
:取消延時工作任務并等待它完成
6、create_workqueue()
:對于多CPU系統,內核會在每個CPU上創建一個工作隊列,使線程處理并行化
7、create_singlethread_workqueue()
:內核只在一個CPU上創建一個工作隊列
8、queue_work_on()
:在指定CPU上添加工作任務,queue_work()
調用queue_work_on()
在所有CPU上添加工作任務
1、共享工作隊列
文件:drivers/gpu/drm/drm_fb_helper.c
,舉例如下:
## 3、工作任務的具體實現static void drm_fb_helper_restore_work_fn(struct work_struct *ignored){ ...}## 1、定義工作任務,名稱:drm_fb_helper_restore_work,實現函數:drm_fb_helper_restore_work_fnstatic DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);static void drm_fb_helper_sysrq(int dummy1){ ## 2、將drm_fb_helper_restore_work加入到全局工作隊列 schedule_work(&drm_fb_helper_restore_work);}
其它接口使用方法類似。
2、自定義工作隊列
文件:drivers/input/touchscreen/gt9xx/gt9xx.c
## 1.定義工作任務和工作隊列static struct delayed_work gtp_esd_check_work;static struct workqueue_struct * gtp_esd_check_workqueue = NULL;static int goodix_ts_init(void){ ... ## 2.初始化工作任務gtp_esd_check_work; 創建工作隊列gtp_esd_check_workqueue INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); ...}## 3.工作任務gtp_esd_check_work的實現函數static void gtp_esd_check_func(struct work_struct *work){ ...}void gtp_esd_switch(struct i2c_client *client, s32 on){ ... ## 4.將工作任務gtp_esd_check_work添加到工作隊列gtp_esd_check_workqueue,延時調度 queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); ... ## 5.等待延時任務完成 cancel_delayed_work_sync(>p_esd_check_work); ...}static int goodix_ts_remove(struct i2c_client *client){ ... ## 6.銷毀工作隊列gtp_esd_check_workqueue destroy_workqueue(gtp_esd_check_workqueue); ...}
注:工作隊列允許任務重新調度和睡眠。
看完上述內容,你們對Linux內核工作隊列是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。