中断处理函数有自身的局限:
1,中断可以打断任何重要代码(除去中断屏蔽下的中断处理函数和中断优先级高的中断处理函数)。要求中断处理函数速度越快越好。
2,中断自身会屏蔽,一般是屏蔽同级的中断,也可屏蔽所有的中断。
3,涉及对硬件的操作。
4,中断在进程上下文中进行。
因为以上局限,引入了中断下半部。BH和任务队列(task queue) 已经从2.5去掉。
还有以下三种类型,软中断(softirq),tasklet和工作队列(work queue):
软中断:用数组实现,最大只能有32个软终端(最大值不能更改)。不能抢占另一个软终端,唯一可以抢占软终端的是中断处理函数。
保留给系统中对时间要求最严格以及最重要的下半部使用。目前只有网络和scsi直接使用软终端。不能休眠,在多处理器机器上可以对同一软终端同时运行。
软中断的调度:在中断返回的时候,内核检查所有挂起的软中断,并处理他们,但是自行重新触发的软中断,将放到下一个软中断执行时机去处理。一般是利用一个内核线程(ksoftirqd/n),区别在于n,对应的处理器的编号。
tasklet:利用软终端实现。两类软终端代表,HI_SOFTIRQ和TASKLET_SOFTIRQ。唯一的区别是优先级的不同。
工作队列(work queue).进程上下文执行,可以睡眠,跟其他的内核线程一样,叫做工作者线程(worker thread) events/n,n是处理器的编号。也可以通过create_workqueue创建一个新的workqueue内核线程来处理需要的函数。