软中断操作
软中断(softirq)不象硬中断那样是由硬件中断信号触发执行的,所以也不同于硬件中断那样时随时都能够被执行,笼统来讲,软中断会在内核处理任务完毕后返回用户级程序前得到处理机会。具体的讲,有三个时刻它将被执行(do_softirq()):硬件中断操作完成后;系统调用返回时;内核调度程序中;(另外,内核线程ksoftirqd周期执行软中断).从中可以看出软中断会紧随硬中断处理(好象狐假虎威),所以抢占内核任务——至少在时钟中断后总有机会运行一次.还要记得软中断可以在不同处器上并发执行,在有对称多处理器的机器上,那么两个任务就可以真正的在临界区中同时执行了,这种类型被称为真并发.相对而言在,单处理器上并发其实并不是真的同时发生,而是相互交错执行,是伪并发.但它们都同样会造成竞争条件,而且也需要同样的保护.软中断是很底层的机制,一般除了在网络子系统和SCSI子系统这样对性能要求很高以及要求并发处理的时候,才会选择使用软中断.软中断虽然灵活性高和效率高,但是你自己必须处理复杂的同步处理(因为它可在多处理器上并发),所以通常都不直接使用,而是作为支持Tasklet和BH的根本需要说明的是,软中断的执行也处于中断上下文中,所以中断上下文对它的限制是和硬中断一样的
Tasklet
Tasklet 和bottom half都是建立在软中断之上的两种延迟机制,其具体不同之处在于软中断是静态分配的,而且同类软中断可以并发地在几个CPU上运行;Tasklet可以动态分配,并且不同种类的Tasklets可以并发地在几个CPU上运行,但同类的tasklets 不可以;bottom half只能静态分配,实质上,下半部分是一个不能与其它下半部分并发执行的高优先级tasklet,即使它们类型不同,而且在不同CPU上运行。 Tasklet可以理解为软中断的派生,所以它的调度时机与软中断一致.对于内核中需要延迟执行的多数任务都可以利用tasklet来完成,由于同类tasklet本身已经进行了同步保护,所以使用tasklet相比软中断要简单得多,而且效率也不错
bottom half
是 BH时最早的内核延迟方法,它原始、简单且容易控制,因为所有的BH处理程序都被严格地顺序执行——不允许任何两个BH处理程序同时并发执行,即使它们的类型不同也不可以,这样一来BH执行其间减少了许多同步保护。但是BH不得不被淘汰,因为它的“简便”牺牲了多处理器并发处理的高性能,等于一队人过独木桥那样速度受到牵制
任务队列
任务列队是BH的替代品,来自BH,所以它的属性也和BH相同。它的原意在于简化BH的操作接口,但它的随意性(数量随意、执行时机随意)却给系统带来了混乱,所以到今天已经被工作队列(在2.6内核中)所取代.
工作队列
工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。
阅读(1133) | 评论(0) | 转发(0) |