请问如果在中断上下文中调用可能引起阻塞的代码到底会怎么样?

发布于 2022-07-24 15:26:01 字数 20 浏览 13 评论 6

是不是中断处理程序就永远不能继续执行了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

歌入人心 2022-07-26 06:49:23

原帖由 dengcainiao 于 2006-8-2 11:24 发表
学习了。。。。。
对中断线程话的概念完全不了解。不知道是不是用现在内核中用工作队列处理工作下半部一样。将中断处理程序挂到一个内核线程下的工作队列里?

solaris下低于时钟中断或者是dispatch lock级别以下的中断,如网卡中断,是以内核线程的形式存在的。这些线程是per CPU的,每个level一个,组成一个线程list,挂在cpu structure的结构里。

这些线程具有比一般内核线程高的优先级,可以保证尽快执行。

[ 本帖最后由 Solaris12 于 2006-8-2 13:20 编辑 ]

呆萌少年 2022-07-26 06:48:00

学习了。。。。。
对中断线程话的概念完全不了解。不知道是不是用现在内核中用工作队列处理工作下半部一样。将中断处理程序挂到一个内核线程下的工作队列里?

夜访吸血鬼 2022-07-26 06:45:38

原帖由 richardhesidu 于 2006-8-1 23:01 发表
fb下中断处理已经线程化,可以休眠。不过休眠以后这个线程就不能再唤醒了。

不知道fb是什么? 如果中断线程化指的是RT内核中实现的那样, 中断handler在线程中执行,这样的ISR可以阻塞。

如果是到现在为止的2.6.18-RC3的内核,在中断handler中执行导致阻塞的代码,内核会把调用栈打出来,提示在atomic中调用schedule(),这个判断在schedule().  假设没有这些判断,允许你sleep,我想到了下面的结果:
1. 如果你的handler关中断运行(flags & IRQF_DISABLED),
    a 可能会导致系统死掉,这取决于你的sleep是否因为其它中断 handler,
    b 系统延迟很大
2. 如果你的系统handler开中断运行,
    a 系统死掉, 如果你用4K内核栈
    b 系统死掉,即使handler运行在任务栈中,因为任务的唤醒不一定取决于这次阻塞,如信号等

而且,根据sleep是否因为和哪些不同的上下文互斥,异常的现象需要具体分析。但你的那个设备肯定是不能正常工作的。

所谓中断线程化,也是低优先级的中断。
高优先级的中断还是特殊的上下文,不能够阻塞的。

所以在solaris或者bsd这样的中断线程化的系统里,在高优先级中断睡眠,基本上就是panic或者hang了

是这样的,在Linux的RT Patch中,如时钟中断肯定不能线程化,所以中断handler中执行导致阻塞的代码,肯定有问题。

戏舞 2022-07-26 06:34:41

原帖由 richardhesidu 于 2006-8-1 23:01 发表
fb下中断处理已经线程化,可以休眠。不过休眠以后这个线程就不能再唤醒了。

所谓中断线程化,也是低优先级的中断。
高优先级的中断还是特殊的上下文,不能够阻塞的。

所以在solaris或者bsd这样的中断线程化的系统里,在高优先级中断睡眠,基本上就是panic或者hang了

不必你懂 2022-07-26 06:10:54

fb下中断处理已经线程化,可以休眠。不过休眠以后这个线程就不能再唤醒了。

冷默言语 2022-07-26 05:49:20

原帖由 dengcainiao 于 2006-8-1 14:07 发表
是不是中断处理程序就永远不能继续执行了?

在solaris下,这样会引起系统panic的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文