markdown
---
title: "Linux 中断处理:上半部与下半部(SoftIRQ/Tasklet/Workqueue)"
slug: "linux-interrupt-top-half-and-bottom-half"
category: "Linux与网络"
tags: ["Linux内核", "中断处理", "并发"]
status: "PUBLISHED"
---
Linux 将中断处理拆分为上半部(Top Half)与下半部(Bottom Half),以在保证响应实时性的同时完成耗时工作。
## 一、上半部与下半部的分工
上半部运行在中断上下文中,必须快速执行且不可睡眠;下半部则延后执行耗时的数据处理逻辑。内核提供三种下半部机制:
- **SoftIRQ**:静态注册、可并行于多核,适合网络与块设备等高吞吐场景
- **Tasklet**:基于 SoftIRQ 实现,同一 Tasklet 不会并行执行
- **Workqueue**:运行在进程上下文,允许睡眠,适合需要阻塞的操作
## 二、Workqueue 使用示例
```c
static void my_work_fn(struct work_struct *work) {
/* 可睡眠的耗时处理 */
}
static DECLARE_WORK(my_work, my_work_fn);
static irqreturn_t my_irq_handler(int irq, void *dev) {
schedule_work(&my_work);
return IRQ_HANDLED;
}合理选择下半部机制是编写高吞吐驱动的关键。