驱动开发笔记--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);//销毁新创建的工作者进程
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值