tasklet,taskqueue,work-queue - 要使用哪个?

时间:2013-02-20 14:42:55

标签: linux-device-driver embedded-linux interrupt-handling

我过去几个月经历了ldd3。我多次读了几章。

这两个链接使用不同的方式,一个是使用工作队列,另一个是使用任务队列。实施下半部分 http://www.tldp.org/LDP/lkmpg/2.4/html/x1210.html http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x1256.html

我怀疑tasklet, taskqueue, work-queue所有人似乎都在空闲时间做一些任务: -

a)这三者之间的差异究竟是什么?

b)哪个应该用于中断处理程序的下半部分?

困惑...... ???

2 个答案:

答案 0 :(得分:3)

Tasklet和工作队列通常在下半部分使用,但它们可以在任何地方使用,它们对它们没有限制

关于差异。

1)Tasklet用于中断上下文。所有tasklet代码必须是原子的,因此应用于原子上下文的所有规则都应用于它。 例如。他们无法入睡(因为他们无法重新安排)或长时间保持锁定。

2)与Tasklet不同,工作队列执行是在进程上下文中意味着它们可以长时间休眠并保持锁定。

简而言之,tasklet用于快速执行,因为它们无法在正常执行下半部分时使用工作队列的情况下休眠。两者都在以后由内核执行。

答案 1 :(得分:1)

Softirq和tasklet都是中断上下文tasklet,它在中断上下文中执行,工作在进程上下文代码中执行。允许进程上下文代码在执行时休眠,但执行时不允许中断上下文代码休眠(只有另一个中断)可以抢占预定的中断上下文。)

您使用的下半部机制完全取决于您正在编写的驱动程序及其要求。

对于Ex。如果您正在编写nw驱动程序,它在中断的基础上向HW发送数据包,您希望毫不拖延地完成此活动,因此只有softirq或tasklet可用的选项。

注意:最好通过Robert Love第8章进行Linux内核开发。我也读过LDD,但Robert Love的Linux内核开发更适合中断相关的理解。