linux工作队列编程

 

首先了解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

你可能感兴趣的:(工作,linux,struct,Module,任务,events)