为什么进程不能抢占中断?

时间:2015-03-29 09:32:20

标签: c linux kernel interrupt context-switch

我知道当发生中断时,进程运行被置于保持状态,并且调用中断服务程序。 current指针指向被中断的进程,我被告知当发生中断时它没有链接到特定进程。所以我的问题是为什么只有另一个中断可以抢占现有的中断例程?

此外,当进程(p2)抢占另一个进程(p1)时,谁正在调用schedule()方法?

3 个答案:

答案 0 :(得分:2)

  

所以我的问题是为什么只有另一个中断可以抢占现有的   中断程序?

硬件中断通常会使处理器硬件处于中断状态,其中所有中断都被禁用。中断处理程序可以并且经常显式地重新启用更高优先级的中断。然后,这样的中断可以抢占低优先级中断。这是唯一可以中断硬件中断的机制。

  

此外,当进程(p2)抢占另一个进程(p1)时,谁正在调用   schedule()方法?

这在某种程度上取决于抢占是由来自已经运行的线程的系统调用启动的,还是由导致处理程序/驱动程序运行并随后进入内核以请求重新调度的硬件中断启动的。使用的确切机制(状态,堆栈等)取决于架构。

答案 1 :(得分:2)

关于第一个问题:在中断运行时,该处理器上的中断被禁用。因此,它不能被打断。

关于你的第二个问题:一个进程永远不会抢占另一个进程,它始终是操作系统所做的。操作系统定期调用调度程序例程,在此处决定下一个运行的进程。所以p2并没有说'#34;我想立即运行",它只是有一些属性,如优先级,剩余时间段等,然后操作系统决定是否应该立即运行p2。

答案 2 :(得分:1)

前两个答案都显示出对中断及其工作方式的一些重大误解

特别感兴趣,

对于我们通常使用的CPU

(86x ..,power PC,68xxx,ARM等等)

每个中断源都有一个优先级。

遗憾的是,有一些CPU,例如68HC11,除了复位中断和NMI中断之外,所有中断都具有相同的优先级,因此处理任何其他中断事件将阻止所有其他(相同的优先级)中断事件。

出于讨论目的,更高优先级的中断事件可以/将中断低优先级中断处理程序。

(中断处理程序可以修改相应的硬件寄存器以禁用所有中断事件或仅发生某些中断事件。甚至可以通过清除自己的中断挂起标志(通常是寄存器中的位)来启用较低优先级的中断

通常,调度程序由中断处理程序

调用

(或通过自愿放弃CPU的过程)

该中断通常是硬件定时器到期/重新加载并触发中断事件的结果。

中断实际上只是事件等待服务的事件。

中断事件,如果允许,例如作为当前待处理的最高优先级中断,将导致PC寄存器加载相关中断处理程序的第一个地址。

将PC寄存器转移到中断处理程序的行为(至少)将先前的PC寄存器值和状态寄存器压入堆栈。 (在某些CPU中,这些寄存器有一组特殊的保存区域,因此它们被推到特殊区域而不是堆栈上。

从中断返回的行为,例如通过RTI指令,将“自动”导致先前的PC和状态寄存器值被恢复。

注意:从中断处理程序返回不会清除中断事件挂起指示,因此中断处理程序在退出之前需要修改相应的寄存器,否则执行流程将立即重新进入中断处理程序。

中断处理程序在进入时必须推送它修改的任何其他寄存器,并在准备退出时恢复它们。

只有较低优先级的中断才会被中断事件阻止,将PC转移到相应的中断处理程序。被阻止,未被禁用。

在某些CPU上,例如大多数DSP,还有可以通过指令执行触发的软件中断。 硬件中断处理程序通常使用它来在一定量的数据输入/保存在缓冲区中后触发数据处理。这将I / O与处理分开,从而使硬件中断事件处理程序能够快速并且仍能及时处理数据

上述内容与评论和其他答案所述的大部分内容相矛盾。然而,这些评论和答案来自操作系统“用户”方面的误导性观点,而我通常在裸硬件上编程,因此我非常熟悉实际发生的情况。