中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux內核工作隊列是什么

發布時間:2021-08-05 16:48:30 來源:億速云 閱讀:128 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關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(&gtp_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, &gtp_esd_check_work, ts->clk_tick_cnt);    ...    ## 5.等待延時任務完成    cancel_delayed_work_sync(&gtp_esd_check_work);    ...}static int goodix_ts_remove(struct i2c_client *client){    ...    ## 6.銷毀工作隊列gtp_esd_check_workqueue    destroy_workqueue(gtp_esd_check_workqueue);    ...}

注:工作隊列允許任務重新調度和睡眠。

看完上述內容,你們對Linux內核工作隊列是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青铜峡市| 观塘区| 峨山| 乌鲁木齐市| 乡宁县| 化德县| 青海省| 湖州市| 寿阳县| 青神县| 巨野县| 邯郸县| 札达县| 乌拉特前旗| 武威市| 浦东新区| 垣曲县| 观塘区| 开封市| 花垣县| 涿州市| 乌兰县| 兴城市| 岢岚县| 新兴县| 萨嘎县| 姚安县| 虞城县| 含山县| 屯留县| 山西省| 监利县| 阿拉尔市| 涟源市| 尉犁县| 台前县| 绥棱县| 元氏县| 宁陵县| 象山县| 南充市|