中断是指CPU
在执行程序的过程中,中断源向CPU
发送一个中断请求,CPU
停止正在运行的程序并保护现场数据,转入中断服务程序进行处理,处理完毕后返回原来被暂停的程序继续执行。
为保证系统实时性,中断服务程序必须足够简短。如果需要在中断服务程序中完成复杂事物处理,Linux
系统中把中断服务程序分为两部分:中断上下文,也叫中断上半部和中断下半部。
中断上半部的功能是响应中断,当中断发生时,把设备驱动程序中中断处理例程的下半部挂到设备的下半部执行队列中,继续等待新的中断到来。由于Linux
内核不支持中断嵌套,上半部会完全屏蔽中断,如果没有执行完,其他中断就不能及时处理,只能等到这个中断处理程序执行完毕后。
中断上半部是不能中断的,中断下半部是可以中断的。实时性要求高的,必须放中断上半部。
中断下半部主要有:软中断(softirq
)、tasklet
和工作队列(workqueue
)。
下面简单介绍下中断下半部三者之间的区别。
一、软中断
softirq
工作在中断上下文,执行优先级比进程高,可以抢占进程执行,用于处理实时性要求高的任务。例:在中断执行完成的时候,立刻执行下半部,选择softirq
。
1、软中断只允许静态地编译到内核,不能动态地添加到系统。
2、最多有32个软中断。
3、软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序
4、同一个softirq
可以并发运行在多个CPU
上,处理数据同步比较棘手。
5、目前只有两个子系统直接使用软中断:网络和SCSI
。
二、tasklet
tasklet
基于softirq
实现,综合考虑性能和使用便捷性。
1、同一类tasklet
不能并发执行,不同类型可以并发执行。
2、tasklet
可以通过代码进行动态的注册,没有数量限制。
3、tasklet
是使用两类软中断实现:HI_SOFTIRQ
和TASKLET_SOFTIRQ
。
软中断和tasklet
是不可以睡眠的。
三、工作队列
工作队列主要用于耗时任务处理,在进程上下文执行,可以睡眠、阻塞。
运行工作队列的内核线程,可以使用系统默认的,也可以自行创建。