免费注册 查看新帖 |

Chinaunix

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

[系统管理] 中断处理程序不能被阻塞 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-02-09 15:14 |只看该作者 |倒序浏览
最近在项目中看到新人写的代码,在中断处理程序中加入了printf。 我告诉他中断处理程序中不能有这种可能导致阻塞性的动作,但当他问我问什么的时候的,我竟答不上来。

不知道是不是很多朋友也像我一样,写代码久了都忘记了一些本质。

针对这个问题,我在网上搜了很多朋友的回答,但是感觉都没有解释到问题的根本。

翻阅内核详解一本书中说到,允许内核控制路径嵌套执行必须付出代价,那就是中断处理程序必须永不阻塞。 也就是说中断程序是因为支持嵌套才不能阻塞的。

仔细一想,我的解释是这样的:

中断发生时不能确定当前运行的是哪一个进程,但是它寄生在当前进程的堆栈中执行。

如果不支持中断嵌套,抛开效率、硬件特性等因素,软件的角度上它是可以被切换的,因为当前内核控制路径只有唯一的进程堆栈。

但是支持中断嵌套的话,当前内核控制路径就可能存在多个进程的堆栈,切换回来后,如果嵌套最底层的堆栈和顶层的堆栈不是同一个进程的话,就会引起进程调度的紊乱。


这样的解释结合调度代码也就能说的通了,不知有幸路过的朋友是什么意见?

求职 : 嵌入式开发
论坛徽章:
0
2 [报告]
发表于 2018-05-29 22:19 |只看该作者
我认为内核至少大多数情况下会借用内核的内核栈。阻塞引起进程调度就找不到原来的内核栈了。

求职 : 嵌入式开发
论坛徽章:
0
3 [报告]
发表于 2018-05-29 22:19 |只看该作者
我认为内核至少大多数情况下会借用内核的内核栈。阻塞引起进程调度就找不到原来的内核栈了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP