首页 理论教育 Linux驱动程序开发实例:理解工作队列

Linux驱动程序开发实例:理解工作队列

时间:2023-10-19 理论教育 版权反馈
【摘要】:工作队列类似tasklet,允许调用者请求在将来某个时间调用一个函数。tasklet一般只能在最初被提交的处理器上运行。工作队列包括一系列将要执行的任务和执行这些任务的内核线程。每个工作队列有一个专门的线程,所有的任务必须在进程的上下文中运行,这样它们可以安全休眠。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个全局工作队列。表5-2 软中断、tasklet和工作队列对比例5.4 工作队列实例代码见\samples\5schedule\5-4work。

Linux驱动程序开发实例:理解工作队列

工作队列(work queue)类似tasklet,允许调用者请求在将来某个时间调用一个函数。tasklet在软件中断上下文中运行,所以tasklet执行很快,持续短,并且一般在原子态。tasklet一般只能在最初被提交的处理器上运行。工作队列在一个特殊内核进程上下文运行,有更多的灵活性,并且能够休眠。工作队列包括一系列将要执行的任务和执行这些任务的内核线程。每个工作队列有一个专门的线程,所有的任务必须在进程的上下文中运行,这样它们可以安全休眠。Linux内核提供了一系列全局work queue,包括system_wq、system_highpri_wq等。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个全局工作队列。工作队列用workqueue_struct结构描述,而任务用work_struct结构描述。工作队列初始化接口如下:

978-7-111-56706-6-Chapter05-28.jpg

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

如果当一个取消操作的调用返回时,任务正在执行中,那么这个任务将继续执行下去,但不会再加入到队列中。

978-7-111-56706-6-Chapter05-29.jpg

978-7-111-56706-6-Chapter05-30.jpg

表5-2是软中断、tasklet和工作队列等机制的比较。(www.xing528.com)

5-2 软中断、tasklet和工作队列对比

978-7-111-56706-6-Chapter05-31.jpg

例5.4 工作队列实例

代码见\samples\5schedule\5-4work。核心代码如下:

978-7-111-56706-6-Chapter05-32.jpg

本例运行结果如下:

[root@/home]#insmod demo.ko

DemoTask run...

DemoTask end...

[root@/home]#mknod/dev/fgj c 2240

[root@/home]#./read

The data is 11

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈