中断是一种当今很重要的硬件与cpu
通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu
的数目往往要少得多,那么肯定会有多个硬件 中断竞争一个cpu
的情况,任何系统(包括自然界)都不能乱套,肯定会有一定的机制防止事情变得不可控制,这种机制的结果就是使一切变得有序化,出现多竞
争一的情况时,最常用的方法就是排队,而排队有很多策略,比如先来先服务,优先级队列,加权优先级队列,多级队列等等。这是硬件方面的情况,那么cpu
方 面呢,cpu
的中断引脚往往只有一个,这就是说,排队必须在中断到达cpu
前进行,所以中断控制器的作用就体现出来了,有了中断控制器,我们就可以把控制 器后面的硬件当成黑盒子了,只要管控制器里面会接受很多中断并且仲裁它们就可以了。
现在中断控制器和cpu
都讨论了,那么终极控制者--
操作系统还没有登场呢,最终需要os
来控制着一切,就是说,控制器和cpu
提供机制,而os
提供策 略,中断优先级是中断控制器的机制,操作系统可以更改,而中断线程化是os
为了更好的控制中断而实现的一种策略,不同os
控制中断的方式不同,而中断线程 化只是其中的一种。
像unix
比如solaris
都是中断线程化的,线程拥有自己的优先级,优先级高的中断线程当然可以抢占优先级低的中断线程(如果内核可抢占的话),但是
由于中断是cpu
外界的事件报告,所以它的到来不受cpu
控制,那么中断发生的那一瞬间,中断并不是线程化的,而是也像linux
那样进入中断处理,然后 将其对应的中断线程唤醒,此线程就开始参与调度参与抢占了。
那么中断控制器处排队的中断优先级和中断线程的线程优先级有何关系呢?按照道理来说就是一个线性正比关系,事实上也是这样,每个中断控制器都实现了中断优
先级管理,大部分是通过寄存器实现的,比如,x86
芯片组的tpr
寄存器,sun sparc
也有类似的机制,比如通过pil
。
ia
架构的tpr
寄存器可以将所有低优先级的中断屏蔽掉,并且可以限制嵌套次数。但是在linux
中并没有用到这里的tpr
,它将中断一视同仁,不区分由 县级,用最短的时间处理上半部,然后在下半部处理耗时任务,这一方面是效率需要(该来的就让它来,阻止并不是好事!),二来是为了移植性,windows
只在x86
,soaris
只在sparc
和x86
,这些平台都实现了硬件的中断优先级概念,而linux
基于多平台。引用 :
在上半部没有实现中断优先级正是因为linux
的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了,而低优先级中断频繁发生,会导致高优先级中断得不到处理,不正需要屏蔽低优先级中断吗?
而linux
中断分两部分,所以高优先级中断不怕被打断,因为低优先级中断的上半部处理会马上完成。注意,在中断嵌套的时候linux
只处理中断的上半部哦,在进行下半部之前有个判断如下:
QUOTE:
if (!in_interrupt() && local_softirq_pending())
invoke_softirq();
//
引用完了
ipl
是solaris
里面的一个抽象概念,对应中断线程优先级,irql
是windows
里的一个同样意义的抽象概念,它们都实现了低优先中断屏蔽以的 作用,不同的是solaris
中断是线程化的,而windows
是在任意上下文的,后者可能在唤醒中断线程后马上就可以恢复ipl
,而前者必须执行完上半
部后才可;linux
并没有用这些繁琐的东西,它直接允许中断嵌套,不屏蔽任何中断,可谓大气~~
必须理解两个概念,中断响应和中断执行,前者影响到吞吐,后者受os
机制(调度,softirq...
)影响,中断只要被响应,至于怎么执行就看我的
了,linux
正是这么做的,它百分百响应任何中断,所以效率高。在中断线程实现中,有两种方法,一个是预先为每个中断设置线程,二是设置线程池。中断线
程化有个很大的优势就是实时化,因为实时线程可以将优先级调到比中断线程还高(windows
似乎做不到,因为比硬件中断还高的irql
会受到很多限制, 比如,分页内存的访问,调度,睡眠等等)
本文探讨了中断处理的基本原理,包括中断控制器的角色、操作系统如何管理和调度中断,以及不同操作系统如Linux、Solaris和Windows处理中断的不同策略。
125

被折叠的 条评论
为什么被折叠?



