直接回答:硬中断是硬件(网卡、磁盘、时钟)打断 CPU 当前执行、跳转到中断处理程序(ISR)的机制。ISR 运行在中断上下文:没有自己的进程上下文、不能被调度、不能调用可能睡眠的函数(睡眠需要调度器切换,而此刻“被切走的”可能是任意无辜进程)。所以 ISR 只做最短必需动作(应答硬件、取走数据、标记有活干),耗时处理推迟到下半部——软中断/tasklet/工作队列,这就是上下半部拆分。

展开解析:下半部三选一:软中断(softirq,编译期静态注册、可并发在多核执行、网络与块设备在用,要求高)、tasklet(基于软中断、同类型串行化,驱动常用)、工作队列(workqueue,运行在进程上下文可睡眠,最灵活也最慢)。为什么这个设计生死攸关:ISR 执行期间同级或全部中断被屏蔽,ISR 里多待 100 微秒,网卡后续包就可能丢——中断延迟直接决定系统的实时性与 IO 上限。观测:/proc/interrupts 看硬中断分布与增长速率,/proc/softirqs 看软中断;软中断 CPU 占比高(top 里的 si)常是网络小包风暴或单核 IRQ 亲和没做。关联概念:中断合并(NAPI、interrupt coalescing 用“偶尔多等一会”换“少打断 CPU”);线程化中断(PREEMPT_RT 把 ISR 变成内核线程,可调度可优先级化,实时系统的关键改造)。写驱动/内核模块的铁律:中断上下文里只做无锁或自旋锁的短操作,内存分配用 GFP_ATOMIC。

追问方向:timer 中断与调度器的关系?中断风暴如何定位与缓解?

(约 470 字)