工作队列是内核中用于进行延后工作的一种方式。延后工作在很多地方使用到,比如
1.1个错误中断发生后,触发网络适配器重新启动;
2.同步磁盘缓冲区的文件系统任务;
3.给磁盘发送一个命令,并跟踪存储协议状态机。等等
工作队列辅助库向用户提供了两个接口结构:workqueue_struct和work_struct,使用工作队列的步骤如下
1.创建一个工作队列(或一个workqueue_struct),该工作队列与一个或对个内核线程关联。可以使用create_singlethread_workqueue()创建一个服务于workqueue_struct的内核线程。为了在系统中的每个cpu中的每个cpu上创建一个工作者线程,可以使用create_workqueue()变体。
2.创建一个工作元素(或者一个work_struct)。使用INIT_WORK()可以初始化一个work_struct,填充其工作函数地址和参数。
3.将工作元素提交给工作队列。可以通过queue_work()将work_struct提交给一个专用的workqueue_struct,或者通过schedule_work提交给默认的内核工作线程。
使用工作可以省去锁的使用。使用方法
#include <linux/workqueue.h>
struct workqueue_struct *wq;
static int __init wq_init()
{
wq = create_singlethread_workqueue();
return 0;
}
int submit_a_work(void (*fun)(void *vlaue), void *value)
{
static work_struct *a_work;
a_work = kmalloc(sizeof(struct work_struct), GFP_KERNEL);
INIT_WORK(a_work, fun, value);
queue_work(wq, a_work);
return 0;
}