温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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