什么是tasklet和workqueue的区别?

13

我是一名Linux设备驱动程序新手,想要知道taskletworkqueue之间的确切区别。我有以下疑问:

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

14

Tasklets:

  • 旧(大约在2.3版本中引入)
  • 具有简单直观的API
  • 设计用于低延迟
  • 无法睡眠(在软中断上下文中原子运行,并且对于给定处理器和给定tasklet,保证永远不会在超过一个CPU上运行)

Work queues:

  • 较为新(在2.5中引入)
  • 具有灵活的API(支持更多选项/标志)
  • 设计用于高延迟
  • 可以睡眠

总体来说:对于必须在硬中断上下文之外执行的高优先级、低延迟的原子任务,请使用tasklets。

您可以使用tasklet_hi_enable/tasklet_hi_schedule(而不是它们各自的无_hi版本)控制一定程度的优先级。来自这个IBM页面的说明如下:

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

...

来自高优先级向量的tasklets首先得到服务,然后是正常向量上的tasklets。请注意,每个CPU都维护自己的正常和高优先级softirq向量。

对于工作队列,在创建时,您将使用alloc_workqueuecreate_workqueue已弃用),并可以传递一个标志以请求更高的优先级:

WQ_HIGHPRI:

高优先级wq的工作项被排入目标gcwq的高优先级线程池中。高优先级线程池由具有提高的nice级别的工作线程服务。

请注意,正常和高优先级线程池不会相互交互。

其他模块维护着各自独立的工作池,并在其工作人员中实现并发管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接