首先了解workqueue:
linux的工作队列(workqueue)是另外一种将工作推后执行的形式,它和软中断、tasklet 这两种下半部机制都有不同。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。
那么,什么情况下使用工作队列,什么情况下使用tasklet。如果推后执行的任务需要睡眠,那么就选择工作队列。如果推后执行的任务不需要睡眠,那么就选择tasklet。另外,如果需要用一个可以重新调度的实体执行你的下半部处理,也应该使用工作队列。它是唯一能在进程上下文运行的下半部实现的机制,也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,它都会非常有用。如果不需要用一个内核线程来推后执行工作,那么就考虑使用 tasklet。
我们地任务就是创建一个工作者线程来处理我们的工作。我们的工作就是在 5 秒钟之后打印一个"I'm running"的信息。
备注://workqueue_struct是双向循环链表。里面的单元是work_struct
//工作队列子系统是一个用于创建内核线程的接口,通过它创建的内核线程被称作工作者线程(worker thread)。
以下是代码:
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/workqueue.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LOVELYC");
MODULE_DESCRIPTION("This is a test module");
static struct workqueue_struct *queue = NULL;//工作队列
//static struct work_struct work;
//原因详见:http://blog.chinaunix.net/space.php?uid=487105&do=blog&cuid=971040
static struct delayed_work work;//表示工作的结构,因为我的是2.6.32版本的ubantu
//work handle
void work_handle(void *data)
{
printk(KERN_ALERT "after 5 seconds,xaut's work running...\n");
}
static int init_workqueue(void)//模块装载时处理函数
{
queue = create_workqueue("xaut_queue_events");//创建名为""的工作队列
printk(KERN_ALERT "workqueue.mod loading......OK\n");
if(queue == NULL)
{
printk(KERN_ALERT "create xaut's workqueue error\n");
return -1;
}
printk("create xaut's workqueue OK\n");
INIT_DELAYED_WORK(&work, work_handle);//参数是工作和工作处理函数
//INIT_WORK(&work,work_handle);
queue_delayed_work(queue,&work,5000);
return 0;
}
static void exit_workqueue(void)//模块卸载时处理
{
flush_workqueue(queue);//刷新指定工作队列
cancel_delayed_work(&work);//取消延迟的工作调用
destroy_workqueue(queue);//销毁工作队列
printk(KERN_ALERT "xaut's workqueue unloading...OK\n");
}
module_init( init_workqueue );
module_exit( exit_workqueue );
此外有几篇博客是关于workqueue的,推荐:
http://blog.csdn.net/chchchdx123/archive/2011/03/18/6258034.aspx(很好,全,学习!)
http://blog.csdn.net/shenbin1430/archive/2009/07/29/4390655.aspx
http://hi.baidu.com/age2cn/blog/item/aa15cf1249044af6c3ce79a6.html
http://www.embexperts.com/viewthread.php?tid=12
workqueue小结于:2011年4月20日22:59:16
转载请注明出处:http://blog.sina.com.cn/s/blog_642e41c20100qs11.html