【问题标题】:What is the difference between tasklet and workqueuetasklet和workqueue有什么区别
【发布时间】:2013-08-19 19:44:36
【问题描述】:
我是一名 Linux 设备驱动程序新手,想知道tasklet 和workqueue 之间的确切区别。我有以下疑惑:
- 在中断/进程上下文中运行时,中断、tasklet 和工作队列使用哪个内核堆栈?
- tasklet 和 workqueue 将以什么优先级运行,我们可以修改它的优先级吗?
- 如果我实现自己的工作队列列表,我可以独立安排/确定优先级吗?
【问题讨论】:
标签:
c
linux-kernel
linux-device-driver
tasklet
workqueue
【解决方案1】:
小任务:
- 很旧(我相信大约 2.3)
- 拥有简单明了的 API
- 专为低延迟而设计
- 不能休眠(在软 IRQ 上下文中以原子方式运行,并且保证不会在给定处理器的多个 CPU 上运行,对于给定的 tasklet)
工作队列:
- 较新(在 2.5 中引入)
- 拥有灵活的 API(支持更多选项/标志)
- 专为更高的延迟而设计
- 可以睡觉了
底线是:将 tasklet 用于仍必须在硬 IRQ 上下文之外执行的高优先级、低延迟的原子任务。
您可以使用tasklet_hi_enable/tasklet_hi_schedule(而不是它们各自的 no-_hi 版本)来控制某些级别的优先级。来自this IBM page:
普通优先级调度是通过TASKLET_SOFTIRQ级软中断执行的,其中高优先级是通过HI_SOFTIRQ级软中断。
...
首先服务于高优先级向量中的小任务,然后是法线向量上的小任务。请注意,每个 CPU 都维护自己的正常和高优先级软中断向量。
对于工作队列,在创建工作队列时,您将使用alloc_workqueue(create_workqueue 已弃用)和can pass a flag 要求更高的优先级:
WQ_HIGHPRI:
highpri wq 的工作项排入队列的 highpri 线程池
目标 gcwq。 Highpri 线程池由工作线程提供服务
良好的水平。
请注意,normal 和 highpri 线程池不会与每个线程池交互
其他。每个都维护其单独的工人和工具池
其工作人员之间的并发管理。
我无法回答您的所有问题,但我希望这对您有所帮助。