softirq: 软中断由编译期间静态分配,不像tasklet那样动态注册或去除 一个软中断不会抢占另外一个软中断。实际上,唯一可以抢占软中断的是中断处理程序。 不过,其他的软中断——甚至是相同类型的软中断——可以在其他处理器上同时执行。 原理:软中断同步判断的标志是一个per cpu变量,所以只对当前cpu执行了同步,而 没有关心其它cpu上的软中断,所以其他cpu上即使相同类型的软中断也可以 执行。 触发软中断(raising the softirq),中断处理程序会在返回前标记它的软中断,使其在 稍后被执行。于是,在合适的时候,该软中断就会运行。在下列地方,待处理的软中断会 被检查和执行: 1)从一个硬件中断代码处返回时 2)在ksoftirqd内核线程中 3)在那些显式检查和执行待处理的软中断的代码中,如网络子系统。 tasklet: 『同一时间里,相同类型的tasklet只能有一个执行(其他不同类型的tasklet可以同时进行, 在不同的CPU上), 由TASKLET_STATE_RUN来控制的。』 很像真正的中断, 不可重入嵌套 原理:taskelet的同步判断标志是 struct tasklet_struct->state,锁住该标志别的cpu就不能执行该taskelet了。 这就是同一个tasklet不需要锁保护机制 而不同的tasklet之间有数据共享的话,需要加锁 而相同的softirq是可以在多处理上同时运行. 这点是它和中断处理程序以及tasklet的最大区别 workqueue
工作队列是用内核线程实现的下半部 是唯一能在进程上下文运行的下半部实现的机制,也只有它能够睡眠。 |
|