一/概述
1,linux有两种非紧迫,可中断内核函数:可延迟函数(softirq与tasklets)和通过队列来执行的函数
2,软中断与tasklets的关系:
tasklet是在软中断的基础上实现的。软中断的分配是静态的,而tasklet的分配和初始化可以在运行时进行。软中断可以并发的运行在多个CPU上。因此软中断是可重入函数而且必须明确的使用自旋锁保护其数据结构。tasklet不必担心这个问题,因为相同类型的tasklet总是串行的执行。所以tasklet可以不必是可重入的。
3,可延迟函数执行的四种操作
initialization---->activation---->masking----->execution
二/软中断的原理
1,表示软中断的数据结构是一个包含32个softirq_action类型数据的softirq_vec数组
2,softirq_action元素在数组内的下标表示一个软中断的优先级。softirq_action包含两个部分,指向软中断处理
函数的action指针和指向软中断函数需要的通用数据结构的data指针。
3,软中断的执行流程:
1.open_softirq()处理软中断的初始话,它的参数是softirq_vec的下标,softirq_action的action指针
和data指针。
2.raise_softirq()激活软中断,它接受软中断下标nr作为参数
3.do_softirq()处理挂起的软中断(但只做固定次数的循环)
4.如果第3步没有处理完所有挂起的软中断,由wakeup_softirqd()激活内核线程ksoftirqd来处理剩下
的软中断。
注:内核线程可以平衡软中断的连续高流量和普通用户。
阅读(1441) | 评论(0) | 转发(0) |