免费注册 查看新帖 |

Chinaunix

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

中断处理程序为什么不能挂起 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-26 10:35 |只看该作者 |倒序浏览
本人从未在讲操作系统理论的书上看到中断处理程序不能挂起的说法,但实际的操作系统都遵循这个原则。我分析了一下linux,觉得有以下几个原因:
1. 保护数据结构的考虑.
    中断作为一种保护数据结构的方式,如果可以挂起,从而发生进程切换,那么切换到的新进程有可能修改中断也在访问的数据,可能产生问题.
2. 效率的考虑
   中断处理程序执行的时候,一般同种类型的中断则不再响应,因此如果把中断挂起,会大大降低中断处理的效率。
3. 简单性的考虑
   如果允许中断挂起,那么将涉及到中断如何切换,如何恢复等问题,复杂性增加。

以上是我认为的几个原因,不知道说的对不对,也不知道是否还有其他的原因。请大家指点一下。
ps:注意我们这里并不讨论目前linux内核不能处理中断挂起的问题,比如说schedule()函数不能保存中断的上下文等。我感觉schedule之所以写成这样是因为在设计的时候就有"中断处理程序不能挂起"这个设计原则。

论坛徽章:
0
2 [报告]
发表于 2008-10-26 13:41 |只看该作者
我也没有看到过一定不能挂起的说法,不过如果挂起的话,什么时候切换会那个被中断打断的进程(中断实际上用的它的内核栈嘛)还是未知数,所以如果中断挂起,那么中断的执行情况将变得不确定,毕竟大部分中断都是期望快速响应执行的。另外,如果存在那种非常不紧急的中断,对处理时间也没什么要求的话,我觉得倒是可以挂起,不知道传说中的Solaris中断线程化是不是就是这样的,把对时限要求不严格的中断线程化了。

论坛徽章:
0
3 [报告]
发表于 2008-10-26 14:02 |只看该作者
确实是,如果挂起,中断处理会变得不确定。
ULK上“中断和异常处理程序的嵌套执行”章节上说:“允许内核控制路径嵌套执行必须付出代价,那就是中断处理程序必须永不阻塞,换句话说,中断处理程序运行期间不能发生进程切换。”
不明白他这句话,中断嵌套和中断挂起有什么必然的联系?就算嵌套了在挂起了,下次再切换回当前进程,不是也可以从内核栈中恢复出中断上下文的吗?

论坛徽章:
0
4 [报告]
发表于 2008-10-26 17:06 |只看该作者
考虑一下中断线程化。
传说Solaris支持,linux也出了相关的补丁,不过好像还没有进入源代码树。

论坛徽章:
0
5 [报告]
发表于 2008-10-26 17:55 |只看该作者
嵌套的话 当前中断完了 肯定就回到被嵌套的那个中断中了,但是如果挂起的话,涉及到进程切换了,就不一定会回到那个中断处理程序打断的进程了

论坛徽章:
0
6 [报告]
发表于 2008-10-26 20:09 |只看该作者
中断不属于任何进程, 中断自己也不是进程, 所以本身就没有挂起的说法吧?
我觉得中断的优先级比任何进程都高, 这就是为什么它叫做中断, 是它去中断
进程或者其他内核代码的执行, 而不是进程来中断它.

其次是中断挂起的目的是什么? 进程挂起,或者说睡眠的目的是因为进程必须
等待资源,或者超过它运行的时间片了, 必须睡眠. 中断没有这样的情况. 如果说
有的话, 那就是中断的嵌套, 被更高优先级别的中断中断了. 中断设计的目的就是
为了尽快响应异步事件, 在尽可能短的时间内处理事情, 避免中断嵌套. 如果不这样
做的话, 那所有事件都在中断里面处理了, 中断嵌套中断, 没完没了地嵌套下去...
因为这个目的, 所有才有网络数据处理里面的硬中断和软中断的设计了.

另外我不了解SOLARIS里面中断线程化是什么样的概念, 处于什么目的,有什么优点?
哪位朋友来指点迷津一下?

论坛徽章:
0
7 [报告]
发表于 2008-10-27 10:10 |只看该作者
好像是linux的中断处理程序没有线程化,所以所谓挂起无从谈起

论坛徽章:
0
8 [报告]
发表于 2008-10-27 10:18 |只看该作者
是否能挂起应该是对线程、进程而言的吧
而中断并不是一个线程或进程
对中断而言应该是是否允许嵌套什么的

论坛徽章:
0
9 [报告]
发表于 2008-10-27 12:59 |只看该作者
我觉得原因还是在于:如果中断处理程序阻塞,那么对这个中断处理程序所在的进程是不公平的。因为中断是外部事件,与中断前正在执行的进程是没关系的,如果在中断处理过程中发生阻塞,那么进程就会被切换掉,太冤枉了,不合理。

这个跟异常不一样,异常是进程发起的,就算在异常处理中发生阻塞导致进程被切换出CPU,也是合情合理的,谁叫你进程产生异常呢?活该!

不过,从技术实现上来讲,中断处理程序可以阻塞,
但从道理上却讲不通。

论坛徽章:
0
10 [报告]
发表于 2008-10-27 17:03 |只看该作者
谈谈自己对中断的理解,中断来说从逻辑上区分了中断上下文和进程上下文,但从物理代码实现上,中断上下文或者进程上下文对CPU等资源来说并没有什么区别,中断其实是穿了被中断进程的外衣来做与这个进程没有关系的事情,快速执行完毕后,再把控制权给那个被中断进程,就是回到被中断时候的上下文环境中,对被中断进程来说,我觉得可以看做无辜的被强加了一个函数调用一样,反正中断结束时候也会回到被中断的那条指令。如果中断的时候,执行了可以睡眠的代码,我也不知道会发生什么,可能硬件的工作会变得混乱,因为中断处理程序是寄生在被中断进程上的,如果这个进程优先级不高,那么睡眠后的下一次进程切换可能就不能切换到它,也就是不能切换到中断处理程序,同时,这也是内核抢占允许的情况下,所以中断的处理情况会变得非常难以确定。
中断线程化我觉得可以这样理解,我用一个优先级非常高的内核线程来进行中断的线程化处理,这个线程会处理中断服务程序,就算它挂起了,由于优先级非常高,会在很短的时间内再次被调度执行,于是可以保证中断在一定程度上的快速执行。但是这里必须注意到不让其它程序饿死的问题,由于这样的高优先级线程存在,如果它造成不断嵌套的话,是比较恐怖的,用户进程可能饿死

以上个人看法,大家评点评点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP