tasklet和workqueue有什么区别

man*_*m-n 11 c scheduling interrupt linux-device-driver linux-kernel

我是Linux设备驱动程序新手,想知道tasklet和之间的确切区别workqueue.此外,我也有以下疑虑:

  1. 在中断/进程上下文中运行时,哪个内核堆栈会执行中断,tasklet和workqueue?
  2. tasklet和workqueue的优先级是什么,我们可以修改它的优先级吗?
  3. 如果我实现自己的工作队列列表,我可以独立安排/优先排序吗?

eep*_*epp 13

Tasklets:

  • 很老(我相信大约2.3)
  • 有一个简单,简单的API
  • 专为低延迟而设计
  • 无法休眠(在软IRQ上下文中以原子方式运行,并保证永远不会在给定处理器的多个CPU上运行,对于给定的tasklet)

工作队列:

  • 更近期(2.5中介绍)
  • 拥有灵活的API(支持更多选项/标志)
  • 旨在提高延迟
  • 可以睡觉

底线是:将tasklet用于高优先级,低延迟的原子任务,这些任务必须仍然在硬IRQ上下文之外执行.

您可以使用tasklet_hi_enable/ tasklet_hi_schedule(而不是各自的无_hi版本)使用tasklet控制某种级别的优先级.从这个IBM页面:

正常优先级调度通过TASKLET_SOFTIRQ级softirq执行,其中高优先级通过HI_SOFTIRQ级softirq.

...

首先处理来自高优先级向量的Tasklet,然后是法向量上的那些.请注意,每个CPU都保持自己的普通和高优先级softirq向量.

对于工作队列,在创建工作队列时,您将使用alloc_workqueue(create_workqueue不推荐使用)并且可以传递一个标志以请求更高的优先级:

WQ_HIGHPRI:

highpri wq的工作项排队到目标gcwq的highpri线程池.Highpri线程池由工作线程提供,具有提升的良好级别.

请注意,普通和高级线程池不会相互交互.每个人都维护着独立的工作池,并在其工作者之间实现并发管理.

我无法回答你所有的问题,但我希望无论如何这都有帮助.