zx_wing
发表于 2008-03-25 22:35
原帖由 dengcainiao 于 2008-3-25 22:30 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有力了。但是就s ...
solaris上下半部的问题我也问过solaris12,它确实有上半部。
至于下半部嘛,我想和linux不同的地方在于,linux执行完上半部后紧接着马上就执行下半部,这就是所谓的尽可能快的处理中断。只有中断过多时下半部才推后。
我估计solaris的处理是,上半部执行完后,就把这个中断的下半部放到一个内核线程里,至于这个下半部什么时候执行,就要等到该线程被调度到了。
所以我认为solaris中的软件中断优先级的概念,主要应该在于这个中断处理线程的优先级。
zx_wing
发表于 2008-03-25 22:51
原帖由 dengcainiao 于 2008-3-25 22:30 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。但是就 ...
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。
这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了,而低优先级中断频繁发生,会导致高优先级中断得不到处理,不正需要屏蔽低优先级中断吗?
而linux中断分两部分,所以高优先级中断不怕被打断,因为低优先级中断的上半部处理会马上完成。注意,在中断嵌套的时候linux只处理中断的上半部哦,在进行下半部之前有个判断如下:
if (!in_interrupt() && local_softirq_pending())
invoke_softirq();
所以高优先级的中断是不怕被低优先级中断打断的。
dengcainiao
发表于 2008-03-25 23:11
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。
这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了...................................
可能我没说清楚,其实我要表达的意思就是你后边解释的。我也认为中断优先级对那些不分上下部的中断处理程序更有意义。问题是象solaris这样的操作系统它实际上是把中断处理程序分开处理的,想必它实际的上半部处理也如LINUX一样是十分短小精悍的。即使在这种情况下它仍然实现了中断优先级,这无疑使代码复杂度增加了很多,不了解solaris等操作系统是出于什么考虑增加这种机制的?
dengcainiao
发表于 2008-03-25 23:14
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理
zx_wing
发表于 2008-03-25 23:15
原帖由 dengcainiao 于 2008-3-25 23:11 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。
这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下 ...
那就等solaris12同志来解释一下solaris中的软件中断优先级到底是指:CPU规定的中断优先级还是中断处理线程的优先级
zx_wing
发表于 2008-03-25 23:16
原帖由 dengcainiao 于 2008-3-25 23:14 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理
LZ考虑的很深入啊,赞一个!:em09:
应该是不行,至少linux的中断线程化的patch对于时钟这样的中断是不能被线程化的。
Solaris12
发表于 2008-03-26 08:13
原帖由 zx_wing 于 2008-3-25 21:30 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
软件优先级是否一定很高效我看不见得,呃,可能我还没想出来这种模型在哪种情况下具有优势。
至于为啥linux没有软件中断优先级,我认为是和linux中断模型有关。
linux处理中断没有使用像solaris中的中断线程 ...
你说的我非常赞同, 目前Solaris, Freebsd, windows都支持中断线程:
1. 中断优先级和中断线程化有关, 因为中断线程成为调度实体, 所以必须要有优先级的概念.
2. 中断线程化主要是为了实时性的支持.
BTW, Linux不是有patch可以支持中断线程化吗?
Solaris12
发表于 2008-03-26 08:21
原帖由 zx_wing 于 2008-3-25 22:19 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
刚才又想了一下,LZ说的软件优先级可能和我上面的回复指的不是一个东西。你是问为啥没实现根据CPU定义的外部中断优先级来屏蔽低优先级中断吧?
IA架构的CPU都提供TPR寄存器来屏蔽低优先级的中断,x86的linux ...
Solaris应该是逻辑上支持中断嵌套的, 这个需要通过中断线程来实现. 当然这块代码我并没有仔细看过, 不知道是不是如你所说. 我的结论来自于用kernel debugger调试时观察的现象.
Solaris中断处理时, 会设置CPU的PIL, 这个就指示了当前CPU可以被哪些级别的中断打断.
看来我有空的时候可以看看这块的实现了.
[ 本帖最后由 Solaris12 于 2008-3-26 08:26 编辑 ]
dengcainiao
发表于 2008-03-26 08:21
软件优先级和中断线程化相关这点我也认同。但是我觉得象solaris这样的操作系统实现中断优先级(这里指的不是软件优先级)和中断线程化没什么关系,更像是为驱动程序实现中断处理程序提供更大的空间,可以允许部分比较特殊的硬件实现中断处理程序完全的原子执行。而中断线程化中提到的优先级应该是一个更宽泛的优先级概念,里边包含的含义应该跨越了中断本身,还涉及到和进程的优先级比较。我觉得这两者还是有区别的。这只是我自己的考虑,不对的地方希望大家指点。
Solaris12
发表于 2008-03-26 08:31
原帖由 zx_wing 于 2008-3-25 22:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
还有一个移植性的问题,假设有的CPU架构没有实现外部中断优先级概念,那么linux的维护就麻烦了,一个系统有几种机制。
而win和solairs本身就是对特定架构的操作系统,现在windows就只支持IA架构的CPU。
solar ...
似乎不可以对优先级编程的系统不多. 目前Solaris支持SPARC, x86, 还有powerpc, 还有IBM的某些大型主机.
Solaris设置CPU PIL的函数似乎来自于早期某个版本的UNIX.
[ 本帖最后由 Solaris12 于 2008-3-26 10:04 编辑 ]