我是 Linux 设备驱动程序新手,想知道 和 之间的确切tasklet
区别workqueue
。我有以下疑问:
- 在中断/进程上下文中运行时,中断、tasklet 和工作队列使用哪个内核堆栈?
- tasklet 和 workqueue 将以什么优先级运行,我们可以修改它的优先级吗?
- 如果我实现自己的工作队列列表,我可以独立安排/优先考虑它吗?
我是 Linux 设备驱动程序新手,想知道 和 之间的确切tasklet
区别workqueue
。我有以下疑问:
- 在中断/进程上下文中运行时,中断、tasklet 和工作队列使用哪个内核堆栈?
- tasklet 和 workqueue 将以什么优先级运行,我们可以修改它的优先级吗?
- 如果我实现自己的工作队列列表,我可以独立安排/优先考虑它吗?
小任务:
工作队列:
底线是:将 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 线程池不相互交互。每个都维护其单独的工作人员池并在其工作人员之间实施并发管理。
我无法回答您的所有问题,但我希望这对您有所帮助。