Workqueue 是内核里面很重要的一个机制,特别是内核驱动,一般的小型任务 (work) 都不会自己起一个线程来处理,而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。所以 Workqueue 的主要设计思想:一个是并行,多个 work 不要相互阻塞;另外一个是节省资源,多个 work 尽量共享资源 ( 进程、调度、内存 ),不要造成系统过多的资源浪费。为了实现的设计思想,workqueue 的设计实现也更新了很多版本。最新的 workqueue 实现叫做 CMWQ(Concurrency Managed Workqueue),也就是用更加智能的算法来实现“并行和节省”。新版本的 workqueue 创建函数改成 alloc_workqueue(),旧版本的函数 create_workqueue() 逐渐会被被废弃。
使用工作队列分成两种情况:一种是利用系统自有的共享工作队列;另一种是创建自定义的工作队列。
#系统共享的工作队列机制
(1)定义一个工作处理函数,函数声明为:
static void my_work_func(struct work_struct *work);
(2)定义一个工作,并为其指定工作处理函数:(有两种类型的work,如下)
/* ①定义普通的工作--work */
struct work_struct my_work;
INIT_WORK(&my_work, my_work_func);