6

在过去的几个月里,我正在经历 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) 中断处理程序下半部分应该使用哪个?

使困惑 ...???

4

2 回答 2

4

Tasklet 和 work-queue 通常用在下半部分,但它们可以在任何地方使用,对它们没有限制

关于区别。

1) Tasklet 在中断上下文中使用。所有的 tasklet 代码都必须是原子的,因此应用于原子上下文的所有规则都适用于它。例如。他们不能睡觉(因为他们不能被重新安排)或长时间持有锁。

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

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

于 2013-03-05T04:19:28.963 回答
1

softirq 和 tasklet 都是中断上下文 tasklet,在中断上下文中执行,workques 在进程上下文代码中执行。进程上下文代码在执行时允许休眠,但中断上下文代码在执行时不允许休眠(只有另一个中断可以抢占调度中断上下文下半部分。)

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

对于前。如果您正在编写基于中断向硬件发送数据包和从硬件发送数据包的 nw 驱动程序,您希望在没有任何延迟的情况下完成此活动,因此唯一可用的选项是 softirq 或 tasklet。

注意:最好阅读 Robert Love 的 Linux Kernel Development 第 8 章。我也读过 LDD,但 Robert Love 的 Linux Kernel Development 仍然有助于理解中断相关。

于 2014-04-08T01:08:12.840 回答