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

use*_*434 5 linux-device-driver interrupt-handling embedded-linux

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

困惑...... ???

duc*_*uck 5

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

关于差异。

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

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

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

  • Softirq 就像微线程一样,它们在中断上下文中运行。但是Softirq需要在编译时注册,而tasklet是动态注册的。此外,两个相同类型的软中断可以同时运行,而两个相同类型的微线程则不能同时运行。 (3认同)
  • 人们通常有一个错误的假设,将 softirq 错误地称为 tasklet 甚至是bottom half。如您所说,Tasklet 是通过 softirq(优先级 5 和 0)实现的。但两者在工作和注册上有所不同。它们有单独的接口来注册它们自己 有 4 种方法可以在 Bottom Half 中推迟工作 1. softirq 2. tasklet 3. workqueue(任务队列的替换) 4. Kernel Timer (2认同)