问题:我的中断处理函数就是执行的时间非常长,怎么办?
如果中断处理函数长时间的占用CPU资源,会导致别的任务无法获取CPU资源,影响系统的并发能力和响应能力。
甚至如果在中断处理函数中进行休眠操作,最终导致linux系统处于僵死状态。
解决:
linux内核为了提供系统的并发能力和响应能力,解决中断处理函数长时间的占有CPU的情况,linux内核将中断处理
函数进行划分,划分为两部分:顶半部,底半部。
顶半部:本质上还是之前的中断处理函数,其中完成的内容相对比较紧急,耗时较短,遵循linux内核要求中断处理函数实行的速度要快这个原则,一旦中断发生以后,内核首先执行顶半部内容,但是这个顶半部占用CPU的时间非常短,也就保证其他任务可以及时获取到CPU的资源。其他复杂的事情可以放在底半部去完成。顶半部还需要登记底半部,告诉CPU我的中断还需要一些比较耗时的内容在将来(空闲时)要去你去完成!顶半部不可被中断!
底半部:完成之前中断处理函数中比较耗时,不紧急的事情,可以被别的中断(硬件中断和软件中断,甚至是进程)打断!底半部的执行会在CPU空闲的时候去完成!
底半部的实现机制:
1.tasklet
实现基于软中断,并且能够指定优先级!运行中断上下文中,tasklet对应的延时函数不能进行休眠动作!
2.工作队列
运行进程上下文中,所以对应的延时函数能够进行休眠操作。
3.软中断
软中断对应的延时函数能够同时运行在多个CPU上,而tasklet不行;
软中断对应的延时函数必须设计为可重入!
软中断的实现不能以模块的形式动态加载和卸载!