文章目录
- 1 软中断(Softirq)
- 1.1 概念与背景
- 1.2 特点与执行
- 1.3 触发与执行方式
- 1.4 实现与使用
- 1.5 软中断的替代机制
- 2 Tasklet
- 2.1 概念与特点
- 3 Bottom Halves(BH)
- 3.1 概念与历史
- 4 工作队列(Workqueue)
- 4.1 概念与特点
- 5 软中断、Tasklet 与工作队列的区别
- 6 延迟任务的含义与实现
- 6.1 延迟任务的含义
- 6.2 Softirq 和 Tasklet 的延迟任务实现
- 6.3 延迟任务的优势
- 7 总结
- 参考链接
- 封面
本文主要分析软中断、Tasklet 和工作队列的机制及其特点。
1 软中断(Softirq)
1.1 概念与背景
软中断是为解决在硬件中断处理过程中,由于长时间屏蔽中断导致中断响应延迟甚至丢失中断的问题而引入的机制。软中断本质上是一种在中断上下文中执行的延迟任务处理机制,它优先于所有任务的执行。
1.2 特点与执行
- 中断上下文执行: 软中断在中断回调函数执行后触发,并且会在软中断执行函数
__do_softirq
中重新开启中断,允许被打断。因此,虽然软中断在中断上下文中执行,但它是可以被其他中断打断的。 - 优先级: 软中断的优先级高于任何任务的优先级。同样,软中断比
tasklet
具有更高的优先级。 - 多核并行: 软中断在多核系统中可以并行执行,但同一个软中断类型不会跨核迁移(即在哪个核触发的软中断就在哪个核上执行)。
- 重入性: 由于软中断在多核上可以并行执行,因此它们的回调函数必须是可重入的,需要使用
spinlock
来保护临界区。
1.3 触发与执行方式
软中断可以在以下三个地方触发执行:
- 硬中断处理结束后: 在硬中断处理结束后,执行在硬中断中
raise
的软中断。 local_bh_enable()
/spin_unlock_bh()
: 当下半部使能时执行,执行时机具有一定的随机性(不易预测)。ksoftirqd
线程: 当软中断正在执行或者执行时间过长时,软中断可能会在线程化的ksoftirqd
中执行。启用实时补丁(RT Patch)后,软中断也会在线程化的ksoftirqd
中执行。由于线程化执行方式受调度影响,执行时间更加不可预测。
1.4 实现与使用
- 静态定义: 软中断在
enum
中静态定义,不能动态申请。系统中的软中断主要用于特权机制,不会随意定义新的静态软中断类型。 - 全局数组管理: 所有软中断及其回调函数按照优先级索引,被定义在一个全局数组中。各类使用软中断的机制会在自己的中断处理函数中
raise
定义的软中断,随后在中断处理结束后执行这些软中断。 ksoftirqd
线程: 每个 CPU 都会创建一个softirqd
线程,以确保未处理的软中断可以在线程中执行。软中断不会跨核触发,在哪个核raise
的软中断,就会在哪个核执行。
1.5 软中断的替代机制
- Tasklet: 基于软中断机制实现的
tasklet
提供了更简单的接口,便于在中断的下半部插入自定义代码。
2 Tasklet
2.1 概念与特点
Tasklet
是基于软中断的机制,用于处理需要延迟的任务。
- 不能并行执行: 同一类型的
tasklet
只能在同一时间在一个 CPU 上运行,避免了竞争条件。 - 适用场景: 适合处理简单的延迟执行任务。
3 Bottom Halves(BH)
3.1 概念与历史
BH
(Bottom Halves)是一个历史概念,曾用于处理需要在中断上下文之外完成的任务。
- 替代机制: 现在主要由软中断和
tasklet
取代。 - 原本用途: 用于在中断处理程序之后执行不紧急的任务。
4 工作队列(Workqueue)
4.1 概念与特点
工作队列是一种在进程上下文中执行延迟任务的机制。
- 上下文: 进程上下文中执行,允许睡眠和阻塞。
- 适用场景: 适合需要长时间运行或可能阻塞的任务。
- 并行性: 可以在多个 CPU 上并行执行。
5 软中断、Tasklet 与工作队列的区别
- 执行上下文: 软中断和
tasklet
在中断上下文中运行,不允许睡眠;工作队列在进程上下文中运行,可以睡眠。 - 复杂度与阻塞: 软中断和
tasklet
适合短小、非阻塞任务;工作队列适合复杂、可能阻塞的任务。 - 并行性: 软中断支持并行执行;
tasklet
不支持同类型的并行执行;工作队列根据需要可以并行执行。
6 延迟任务的含义与实现
6.1 延迟任务的含义
“延迟任务”指的是不需要在中断处理程序中立即完成的任务。这些任务可以稍后执行,以减少中断处理时间,从而提高系统的响应性。
6.2 Softirq 和 Tasklet 的延迟任务实现
-
Softirq:
- 注册与调度: 在内核启动时注册,并在中断或其他触发条件下调度执行。
- 执行: 在中断返回或内核调度点执行,确保不阻塞,因为它们在中断上下文中执行。
-
Tasklet:
- 基于 Softirq:
Tasklet
是Softirq
的一个实现,提供了更简单的接口。 - 调度: 被提交到
tasklet
队列后,在适当的时机由内核运行。 - 执行: 不允许同类型
tasklet
并行执行,避免竞争条件。
- 基于 Softirq:
6.3 延迟任务的优势
- 减少中断处理时间: 硬件中断处理程序应尽快完成,以便系统能够响应其他中断。将复杂或耗时的任务延迟到软中断或
tasklet
中执行,优化了中断响应时间。 - 批量处理: 软中断可以批量处理多个事件,减少上下文切换和调度开销。
- 非实时性任务: 某些任务不需要立即完成,可以稍后处理,如更新统计信息或调度其他工作。
这些机制确保了内核在处理高优先级任务时仍然保持高效和响应性。
7 总结
本文分析了软中断、Tasklet 和工作队列的机制、特点及其应用场景,阐明了它们在延迟任务处理中的重要性和相互关系。
参考链接
- Linux Kernel Documentation
封面
由 DALL-E-3 生成