中断包含上半部和下半部
- 上半部处理非常紧急的事务(关中断), 在硬中断上下文完成
- 下半部处理不紧急任务(可延后处理), 在软中断上下文或进程上下文完成
内核中定义的softirq
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
IRQ_POLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
softirq特性
- 一个softirq不会抢占另一个softirq
- 中断才可以抢占softirq
- 同一个softirq可以在不同的cpu上同时执行(可并行执行)
- softirq必须是可重入
- 在编译期间就已经静态分配好
- 可以动态注册和清除
- 相同的tasklet不能同时执行(无法并行执行)
- tasklet始终运行在被初始提交的同一个处理器上
softirq和tasklet相同的特性
- softirq和tasklet都运行在中断上下文,因此所有的tasklet代码都必须是原子的
- 不可以阻塞,不能休眠
- 不可以被重新调度
- 工作队列函数在一个特殊内核进程的上下文中运行,因此它们具有更好的灵活性,尤其是工作队列函数可以休眠
- workqueue可以通过调度在不同cpu上进行切换执行(可以重新调度), 内核代码可以请求工作队列函数的执行延迟给定的时间间隔
- 普通工作线程kworker/n:x(n表示cpu编号,x表示线程编号)
- 高优先级工作线程kworker/n:xH(n表示cpu编号,x表示线程编号)
- 非绑定全局工作线程kworker/u:x(u表示非绑定,x表示线程编号)