软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。
无论有多少个CPU,内核一共只有32个公共的softirq,但是每个CPU可以执行不同的softirq,
可以禁止/起用不同的softirq,可以激活不同的softirq
软中断的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理
分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键
性的处理动作;而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行
安排运行时机,不在中断服务上下文中执行。bottom half的应用也是激励内核发展出目前的软
中断机制的原因。
软中断是linux系统原“底半处理”的升级,在原有的基础上发展的新的处理方式,
以适应多cpu 、多线程的软中断处理。
一般来说,软中断是由内核机制的触发事件引起的(例如进程运行超时),但是不可忽视有大量的
软中断也是由于和硬件有关的中断引起的,例如当打印机端口产生一个硬件中断时,会通知和硬件
相关的硬中断,硬中断就会产生一个软中断并送到操作系统内核里,这样内核就会根据这个软中断
唤醒睡眠在打印机任务队列中的处理进程。
在网络编程中,软中断用来引发协议层代码的执行
Linux中的软中断机制用于系统中对时间要求最严格以及最重要的中断下半部进行使用。在系统设计
过程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致中断事件
的丢失,所以这就产生了一个问题:中断发生之后的事务处理由谁来完成?在前后台程序中,由于
只有中断上下文和一个任务上下文,所以中断上下文触发事件,设置标记位,任务上下文循环扫描
标记位,执行相应的动作,也就是中断发生之后的事情由任务来完成了,只不过任务上下文采用扫
描的方式,实时性不能得到保证。
这个不断循环的任务就是软中断daemon。在Windows中处理耗时的中断事务称之为中断延迟处理,
在Linux中称之为中断下半部,显然中断上半部处理清中断之类十分清闲的动作,然后在退出中断服
务程序时触发中断下半部,完成具体的功能。
在Linux中,中断下半部的实现基于软中断机制。为什么要定义软中断机制了,一句话就是为了要
处理对时间要求苛刻的任务,恰好中断下半部就有这样的需求,所以其实现采用了软中断机制。
软中断机制实现原理
构成软中断机制的核心元素包括:
1、 软中断状态寄存器soft interrupt state(irq_stat)
2、 软中断向量表(softirq_vec)
3、 软中断守护daemon
软中断的工作工程模拟了实际的中断处理过程,当某一软中断时间发生后,首先需要设置对应的中断
标记位,触发中断事务,然后唤醒守护线程去检测中断状态寄存器,如果通过查询发现某一软中断事
务发生之后,那么通过软中断向量表调用软中断服务程序action()。这就是软中断的过程,与硬件
中断唯一不同的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU需要
将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自动完成的,但是软中断不是,
其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。
一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间
的严格要求。
阅读(3328) | 评论(1) | 转发(0) |