驱动开发笔记--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);//销毁新创建的工作者进程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章