为什么在Linux中断服务程序中不能睡眠

原创 2013年12月02日 11:38:54

最近本人在实现TILE CPU架构上的中断子系统,抽出一点时间来仔细研究了下Linux上的中断设计。对内核有所了解的人都知道,在Linux中断ISR中不能睡眠,但是为什么不能睡眠呢?

其中一个比较流行的答案就是:中断没有进程上下文,如果睡眠之后,进程调度子系统没法来唤醒它。仔细想想,这个答案其实不然。在X86的实现上,中断发生时会借用当前被中断进程的Kernel stack,所以实际上中断是借宿在这个进程上,这个时候中断睡眠是完全可以(当然不合理)的。中断上下文会保存在这个进程的stack上,等到这个进程被唤醒时,会从中断ISR中继续执行。所以,这不是此问题的根本原因。

这么看来,中断睡眠是可以的,不是被禁止的。但是,我们为什么不提倡在中断中睡眠呢?有两个方面的原因:

第一,如果中断睡眠,对中断嵌套不利。我们知道,Linux上不同的中断是可以相互打断,相互嵌套的。如果中断A执行时,中断B发生了,系统会执行中断B的ISR,这时如果中断B去睡眠等待某个资源,那中断A就不知道何时才能继续执行了,因为中断B的睡眠等待时间不可预知。这样设计系统不符合中断的初衷。再进一步试想,如果中断A正好是时钟中断呢。

第二,如果中断睡眠,对被中断的进程不公。发生中断时,中断借用当前被中断的进程的Stack,但是此中断和此线程是毫无关系的。如果此时中断去睡眠,那么此被中断的进程不得不等待中断被继续调度执行。这样,此进程需要等待与他毫无关系的资源不确定的时间,这样设计系统不合理。

再者,如果中断睡眠等待一段不确定时间之后,调度继续执行,这时候再去与硬件设备打交道,恐怕硬件状态早已改变。

为什么在中断过程中不能进行睡眠

运行在中断中的代码不能进行睡眠,或者阻塞!因为代码是运行在中断上下文中,并非进程上下文中,如果将中断进行睡眠的话,调度器无从得知下一个应该调度的进程,系统无法继续进行!         关于调度器在...
  • LinuxEngineer
  • LinuxEngineer
  • 2013年10月08日 11:02
  • 1163

为什么中断不能睡眠

这个问题有很多人问过,我看了下Linux得内核代码,原因如下:(当然我不能保证一定对,如果有牛人理解得更好,欢迎指正) 1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一...
  • mihouge
  • mihouge
  • 2015年03月11日 14:29
  • 1827

中断里面不使用睡眠

不论是书上还是网上,对这块的解释,总是很凌乱,  让人不好理清。   大部分开发者可能也只知其然,不知所以然。 在网上找到一篇对此解释言简意赅,一看就懂的文章,故分享过来。 1...
  • woriwoshi
  • woriwoshi
  • 2015年09月25日 10:37
  • 194

linux kernel 中断处理函数里不能进程调度的原因

 这里就行了很深入的讨论,值得一看: http://bbs2.chinaunix.net/viewthread.php?tid=1618430 但是,他们的讨论最后没有得出一个明确的结论。...
  • oyhb_1992
  • oyhb_1992
  • 2017年06月01日 20:48
  • 139

linux僵尸进程&&进程进入不可中断休眠状态

1.平台Hi3536发现某些进程使用(kill -9)杀不掉 ps查看指令为      ps -o pid,ppid,stat,comm stat:      D    不可中断     Uninte...
  • vc66vcc
  • vc66vcc
  • 2016年06月28日 11:40
  • 3206

中断中不能睡眠的原因

这个说起来有点多,一一来看: 1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求. 2,根据硬件请求响应处理逻辑的实时紧要与否...
  • ruanjianruanjianruan
  • ruanjianruanjianruan
  • 2015年10月12日 22:57
  • 940

Linux kernel 学习之中断

以前学习计算机组成原理的时候就知道了硬件如果要和cpu进行通信有那么几种方法,其实有程序查询法,中断,DMA,通道等,就记得那么多了,我记得好像还有一个。那个时候书上很形象的把这个过程比作是老师分苹果...
  • ccjjnn19890720
  • ccjjnn19890720
  • 2012年02月22日 21:59
  • 3620

Linux中断(interrupt)子系统之一:中断系统基本原理

这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不...
  • DroidPhone
  • DroidPhone
  • 2012年04月12日 21:52
  • 45987

ARM+Linux中断系统详细分析

ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。 ...
  • luteresa
  • luteresa
  • 2017年03月29日 11:07
  • 540

Linux 中断详解

原文地址 http://www.yesky.com/20010813/192117.shtml 方法之三:以数据结构为基点,触类旁通   结构化程序设计思想认为:程序 =数据结构 +算法。...
  • tiangwan2011
  • tiangwan2011
  • 2012年08月21日 15:59
  • 17814
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么在Linux中断服务程序中不能睡眠
举报原因:
原因补充:

(最多只允许输入30个字)