工作队列

工作队列是内核中用于进行延后工作的一种方式。延后工作在很多地方使用到,比如

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;
    
}


你可能感兴趣的:(工作队列)