免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 28812 | 回复: 13
打印 上一主题 下一主题

LINUX的中断处理是否没有中断优先级的概念? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2008-03-25 20:58 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 20:32 发表
今天看ULK3中断处理的章节。其中4.3章有如下描述:

Linux interleaves kernel control paths for two major reasons:

To improve the throughput of programmable interrupt controllers and device cont ...

确实没有,linux不像windows使用了软件中断优先级概念,solaris好像也有。

论坛徽章:
0
2 [报告]
发表于 2008-03-25 21:30 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 21:13 发表
恩,solaris是有,我向熟悉solaris的人了解过了。感觉中断优先级应该是中断系统里挺重要的一个概念,不知道为什么LINUX忽略了。。。

软件优先级是否一定很高效我看不见得,呃,可能我还没想出来这种模型在哪种情况下具有优势。
至于为啥linux没有软件中断优先级,我认为是和linux中断模型有关。
linux处理中断没有使用像solaris中的中断线程那种模型,对于中断的处理都是尽力原则,也就是尽可能快的处理中断,毕竟中断是紧急事件。要注意的是linux本身是通用操作系统,所以在实时性方面就要弱一点(实时性是我目前唯一想到的软件中断优先级的好处,当然linux也有为了实时性而引入的软件中断优先级的patch)。引入软件中断优先级有个条件(个人认为是必须条件),就是中断处理的例程是可以被调度的,说白了就是中断处理应该具有进程/线程上下文,而linux不是这种模型。

此外,linux并非完全不考虑中断频繁而带来的对进程的不公平性,不是还有一个soft_irq嘛。当中断过多的时候,通过ksoftirq内核线程来处理中断,某种意义上就是软件中断优先级的概念,因为线程本身是有优先级的。所以我认为,linux使用的中断模型是:尽可能的处理中断,当中断过多时引入内核线程从而引入优先级的概念。

以上是个人意见,欢迎讨论

论坛徽章:
0
3 [报告]
发表于 2008-03-25 22:19 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 21:13 发表
恩,solaris是有,我向熟悉solaris的人了解过了。感觉中断优先级应该是中断系统里挺重要的一个概念,不知道为什么LINUX忽略了。。。

刚才又想了一下,LZ说的软件优先级可能和我上面的回复指的不是一个东西。你是问为啥没实现根据CPU定义的外部中断优先级来屏蔽低优先级中断吧?
IA架构的CPU都提供TPR寄存器来屏蔽低优先级的中断,x86的linux实现似乎确实没用。个人认为理由比较简单,就是允许中断嵌套。
如果使用TPR来控制中断优先级,举个例子:
例如优先级15的中断发生了,我们通过TPR把优先级小于15的中断都屏蔽了。但这样仅仅是让15优先级的中断先处理完而已,并且禁止了中断嵌套。而linux对大负荷的中断都是放到下半部去处理的,所以完全没有理由阻止中断嵌套,毕竟上半部处理是个很短的过程。

论坛徽章:
0
4 [报告]
发表于 2008-03-25 22:24 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 22:06 发表

多谢你的回答。我是这样理解你的观点的,即LINUX的中断处理程序提倡尽量的简短,快速执行。将中断处理过程中比较耗时的部分放入软中断部分实现。当然在软中断中是开中断的,这样可以允许处理新的中断。而sola ...

是的,LZ理解是对的。
你的疑问我在上面的帖子回复了,因为在上半部处理使用中断优先级的唯一结果就是阻止了中断嵌套,但这样有什么好处呢?我没想到。
此外对ksoftirqd论述是对的,它确实是为了在进程和中断间取平衡的而引入的,我的意思是由于ksoftirqd是线程,同样也引入了中断优先级的概念,进程优先级比它高,先执行就不会饥饿了嘛。呵呵,其实和都是一个道理。

论坛徽章:
0
5 [报告]
发表于 2008-03-25 22:29 |显示全部楼层
还有一个移植性的问题,假设有的CPU架构没有实现外部中断优先级概念,那么linux的维护就麻烦了,一个系统有几种机制。
而win和solairs本身就是对特定架构的操作系统,现在windows就只支持IA架构的CPU。
solaris移植到x86了,而x86正好又是有外部中断优先级的。
linux就不一样,支持那么多架构,而且可能会越来越多。

论坛徽章:
0
6 [报告]
发表于 2008-03-25 22:35 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 22:30 发表
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有力了。但是就s ...

solaris上下半部的问题我也问过solaris12,它确实有上半部。
至于下半部嘛,我想和linux不同的地方在于,linux执行完上半部后紧接着马上就执行下半部,这就是所谓的尽可能快的处理中断。只有中断过多时下半部才推后。
我估计solaris的处理是,上半部执行完后,就把这个中断的下半部放到一个内核线程里,至于这个下半部什么时候执行,就要等到该线程被调度到了。
所以我认为solaris中的软件中断优先级的概念,主要应该在于这个中断处理线程的优先级。

论坛徽章:
0
7 [报告]
发表于 2008-03-25 22:51 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 22:30 发表
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。但是就 ...

>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。

这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了,而低优先级中断频繁发生,会导致高优先级中断得不到处理,不正需要屏蔽低优先级中断吗?
而linux中断分两部分,所以高优先级中断不怕被打断,因为低优先级中断的上半部处理会马上完成。注意,在中断嵌套的时候linux只处理中断的上半部哦,在进行下半部之前有个判断如下:
if (!in_interrupt() && local_softirq_pending())
  invoke_softirq();

所以高优先级的中断是不怕被低优先级中断打断的。

论坛徽章:
0
8 [报告]
发表于 2008-03-25 23:15 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 23:11 发表
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。

这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下 ...

那就等solaris12同志来解释一下solaris中的软件中断优先级到底是指:CPU规定的中断优先级还是中断处理线程的优先级

论坛徽章:
0
9 [报告]
发表于 2008-03-25 23:16 |显示全部楼层
原帖由 dengcainiao 于 2008-3-25 23:14 发表
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理

LZ考虑的很深入啊,赞一个!
应该是不行,至少linux的中断线程化的patch对于时钟这样的中断是不能被线程化的。

论坛徽章:
0
10 [报告]
发表于 2008-03-26 14:28 |显示全部楼层
原帖由 Solaris12 于 2008-3-26 08:41 发表


这个都做到了:

1. 有一个PIL(processor interrupt level)来规定CPU的中断优先级
2. 中断线程优先级主要是为线程调度用的,可以映射到整个系统的调度优先级上.

>>有一个PIL(processor interrupt level)来规定CPU的中断优先级

这个PIL是如何实现和使用的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP