您的位置:首页 > 其它

工作队列

2013-07-16 15:48 148 查看
工作队列是内核中用于进行延后工作的一种方式。延后工作在很多地方使用到,比如

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: