本篇简单介绍中断处理的下半部
中断下半部的必要性
- 中断下半部的存在是为了实现中断的两个重要需求而产生的,一个是中断处理程序必须尽可能快地结束,一个是中断处理程序必须尽可能多的进行运算
- 这两个需求是矛盾的,为了解决这一问题,操作系统就引入了中断上半部和中断下半部的概念,在中断过程中,最紧迫的,最重要的,对时间最敏感的内容被放入中断处理程序中优先执行,中断处理程序也是Linux操作系统中实现中断上半部的唯一方法。而对于哪些不那么急迫,优先级没有这么高的内容,操作系统就没有必要急迫的执行,也就不用放入中断处理程序中去了,此时这些虽然不急迫,但是仍然需要执行的内容就被放入了中断下半部中执行了
- 其实绝大多数的中断下半部在中断上半部一返回就立刻执行了,那么为什么还要把中断上半部和中断下半部分开来呢?这里面其实涉及到的就是中断上半部和下半部的核心区别——中断上半部无法被其他中断打断,但是中断下半部可以被其他中断打断
易混淆的名词
- 中断下半部有非常多的名词,这些名词经常混淆在一起,让人难以理解
Bottom half和BH
- 其实BH就是Bottom Half 的缩写,但是BH的意思有两层
- 代表中断下半部:在起初,中断下半部的命名就是Bottom Half,这是一个和Top Half对应的名词
- 代表一种中断下半部的实现:最初版本的中断下半部的实现就被称为Bottom Half,到现在这个中断下半部早已经被废弃不用了
软中断
- 关于软中断,这是最令人混淆的概念了,软件发起的中断可以叫做软中断;一种中断下半部的实现方案也被称为软中断,这个概念需要结合上下文理解
中断下半部的实现
老版本的中断下半部
- 老版本的经典中断下半部实现就是BH和任务队列,这两种中断下半部的实现已经被废弃不用了
新版本的中断下半部
- 新版本的中断下半部就是软中断、tasklet、工作队列
- 软中断一般是交给哪些对时间有严格要求,执行的速度较快的来执行
- tasklet是基于软中断实现的,它的接口更加简单,使用范围更加广泛
- 工作队列的实现核心是基于内核线程的,如果想要把中断下半部更加推后的执行的话,就只能使用工作队列
- 总的来说,如果你的中断后半部需要有睡眠,那么就只能使用工作队列;如果你的中断后半部在中断上半部执行完毕之后就可以立即执行的话,那么选择tasklet一般是比较不错的,至于软中断,一般情况可以使用tasklet代替,并且效果也不错