工作队列(work queue)类似tasklet,允许调用者请求在将来某个时间调用一个函数。tasklet在软件中断上下文中运行,所以tasklet执行很快,持续短,并且一般在原子态。tasklet一般只能在最初被提交的处理器上运行。工作队列在一个特殊内核进程上下文运行,有更多的灵活性,并且能够休眠。工作队列包括一系列将要执行的任务和执行这些任务的内核线程。每个工作队列有一个专门的线程,所有的任务必须在进程的上下文中运行,这样它们可以安全休眠。Linux内核提供了一系列全局work queue,包括system_wq、system_highpri_wq等。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个全局工作队列。工作队列用workqueue_struct结构描述,而任务用work_struct结构描述。工作队列初始化接口如下:
create_workqueue宏用于创建一个工作队列,它在系统的每个处理器上有一个专用的线程。在很多情况下,过多线程对系统性能有影响,如果单个线程就足够则使用create_singlethread_workqueue宏来创建工作队列。
可以用下面的函数调用把一个任务加入到工作队列中:
bool queue_work(struct workqueue_struct*wq,struct work_struct*work)
int fastcall queue_delayed_work(struct workqueue_struct*wq,struct work_struct*work,unsigned long delay);
在queue_delayed_work()中指定delay,是为了保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。
取消工作队列中没有运行的任务:
int cancel_delayed_work(struct work_struct*work);
如果当一个取消操作的调用返回时,任务正在执行中,那么这个任务将继续执行下去,但不会再加入到队列中。
表5-2是软中断、tasklet和工作队列等机制的比较。(www.xing528.com)
表5-2 软中断、tasklet和工作队列对比
例5.4 工作队列实例
代码见\samples\5schedule\5-4work。核心代码如下:
本例运行结果如下:
[root@/home]#insmod demo.ko
DemoTask run...
DemoTask end...
[root@/home]#mknod/dev/fgj c 2240
[root@/home]#./read
The data is 11
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。