tasklet和workqueue有什么区别

时间:2013-08-19 19:44:37

标签: c linux-kernel linux-device-driver scheduling interrupt

我是Linux设备驱动程序的新手,想知道taskletworkqueue之间的确切差异。此外,我也有疑虑:

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

1 个答案:

答案 0 :(得分:13)

<强>微进程

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

工作队列

  • 是最近的(2.5中介绍)
  • 拥有灵活的API(支持更多选项/标志)
  • 专为更高延迟而设计
  • 可以睡觉

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

您可以使用tasklet_hi_enable / tasklet_hi_schedule(而不是各自的no - _hi版本)来控制使用tasklet的某种级别的优先级。来自this IBM page

  

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

     

...

     

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

使用工作队列,在创建工作队列时,您将使用alloc_workqueuecreate_workqueue已弃用)和can pass a flag要求更高的优先级:

  

WQ_HIGHPRI:

     

highpri wq的工作项排队到highpri线程池   目标gcwq。 Highpri线程池由工作线程提供   提高水平。

     

请注意,普通线程池和highpri线程池不会与每个线程池进行交互   其他。每个人都保持独立的工人和工具库   其工人之间的并发管理。

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