13

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

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

1 回答 1

14

小任务

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

工作队列

  • 更新的(在 2.5 中引入)
  • 拥有灵活的 API(支持更多选项/标志)
  • 专为更高的延迟而设计
  • 可以睡觉

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

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

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

...

首先服务来自高优先级向量的小任务,然后是法向量上的小任务。请注意,每个 CPU 都维护自己的正常和高优先级软中断向量。

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

WQ_HIGHPRI:

highpri wq 的工作项排队到目标 gcwq 的 highpri 线程池。Highpri 线程池由具有较高 nice 级别的工作线程提供服务。

请注意,普通线程池和 highpri 线程池不相互交互。每个都维护其单独的工作人员池并在其工作人员之间实施并发管理。

我无法回答您的所有问题,但我希望这对您有所帮助。

于 2013-08-19T20:53:53.723 回答