中断会打断内核中进程的正常调度和运行,调用中断处理函数。在大多数的系统中,当中断到来时可能耗费大量的时间对它进行处理。如果在中断处理函数中没有禁止中断,该中断处理函数执行过程中仍有可能被其他中断打断。所以我们当然希望中断处理函数执行得越快越好。  

 为了在中断执行时间尽可能短的和中断需要处理完大量的工作之间找一个平衡点,将中断分为上下两部分。

 顶半部完成尽可能少比较紧急的任务,它往往是简单的读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。登记中断:也就是将底半部处理程序挂在底半部执行队列中去。这样上半部执行的速度就会很快,可以服务更多的中断请求。

 现在,中断处理工作的重心就落在了底半部的头上,它来完成中断事件的绝大多数任务。底半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是底半部和顶半部的最大不同,因为顶半部往往被设计成不可中断。底半部则相对来说并不是非常紧急的,而且相对比较耗时,不在硬件中断服务程序中执行。 

1.如果一个任务对时间非常敏感,感觉告诉我还是将其放在中断处理程序中执行是个好的选择。
2.如果一个任务和硬件相关,还是将其放在中断处理程序中执行吧。
3.如果一个任务要保证不被其他中断(特别是相同的中断)打断,那就将其放在中断处理程序中吧。
4.其他所有任务,除非你有更好的理由,否则全部丢到下半部执行。

尽管顶半部、底半部的结合能够改善系统的响应能力,但是,僵化地认为 Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。