/* 最高优先级软中断 */TIMER_SOFTIRQ,/* Timer定时器软中断 */NET_TX_SOFTIRQ,/* 发送网络数据包软中断 */NET_RX_SOFTIRQ,/* 接收网络数据包软中断 */BLOCK_SOFTIRQ,/* 块设备软中断 */IRQ_POLL_SOFTIRQ,/* 块设备软中断 */TASKLET_SOFTIRQ,/* tasklet软中断 */SCHED_SOFTIRQ,/* 进程调度及负载...
IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ,/* Preferable RCU should always be the last softirq */NR_SOFTIRQS};structsoftirq_action{void(*action)(structsoftirq_action*);};staticstructsoftirq_actionsoftirq_vec[NR_SOFTIRQS]__cacheline_aligned_in_smp;...
Softirq和tasklet虽然不会禁用中断,提高了系统对中断的响应性,但是softirq的执行优先级还是比进程的优先级高,有些确实不那么重要的任务其实可以放到进程里执行,和普通进程共同竞争CPU。而且软中断里不能调用会阻塞、休眠的函数,这对软中断函数的编程是很不利的,所以综合各种因素,我们需要把中断处理任务中的与硬件无关有...
软中断,英文叫做softirq,软中断作为下半部机制的代表,是随着SMP(share memory processor)的出现应运而生的,它也是tasklet实现的基础(tasklet实际上只是在软中断的基础上添加了一定的机制)。 软中断一般是“可延迟函数”的总称,有时候也包括了tasklet,它的出现就是因为要满足上面所提出的顶半部和底半部的区别,使得...
softirq tasklet workqueue 其中, softirq 和 tasklet 依赖软中断子系统,运行在软中断上下文中; workqueue 不依赖软中断子系统,运行在进程上下文中。 softirq 前面已经看到, Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例外网络收包对应的 NET_RX_SOFTIRQ 软中断...
workqueue 是除了 softirq 和 tasklet 以外最常用的下半部机制之一。workqueue 的本质是把 work 交给一个内核线程,在进程上下文调度的时候执行。因为这个特点,所以 workqueue 允许重新调度和睡眠,这种异步执行的进程上下文,能解决因为 softirq 和 tasklet 执行时间长而导致的系统实时性下降等问题。
中断的Bottom-half机制,包括了softirq、tasklet、workqueue、以及前文中提到过的中断线程化处理等,其中tasklet又是基于softirq来实现的,这也是本文讨论的主题; 在中断处理过程中,离不开各种上下文的讨论,了解不同上下文的区分有助于中断处理的理解,所以,还是来一张老图吧: ...
本文以目前最新版本的Linux内核2.6.22为例,来讨论Linux的中断下半部机制。在2.6版本的内核中,下半部机制主要由softirq、tasklet和workqueue来实现,下面着重对这3种机制进行分析。 2 Linux 2.6内核中断下半部机制 老版本的Linux内核中,下半部是以一种叫做Bottom Half(简称为BH)的机制来实现的,最初它是借助中断向量...
触发软中断:raise_softirq()函数可以将一个软中断设置为挂起状态,让它在下次调用do_softirq()函数时投入运行 b.tasklet 基于软中断的实现,但它的接口更简单,锁保护要求更低 tasklet 结构体(linux/interrupt.h) struct tasklet_struct{ struct tasklet_struct *next; //链表 unsigned long state; //tasklet 状态 ...
中断的Bottom-half机制,包括了softirq、tasklet、workqueue、以及前文中提到过的中断线程化处理等,其中tasklet又是基于softirq来实现的,这也是本文讨论的主题; 在中断处理过程中,离不开各种上下文的讨论,了解不同上下文的区分有助于中断处理的理解,所以,还是来一张老图吧: ...