欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

文章 #1

发表于:|最后更新:|分类:系统架构|阅读:4384 次
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;
}

合理选择下半部机制是编写高吞吐驱动的关键。