Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 为什么一个系统中有多个中断处理程序而不是一个?_Operating System_Kernel_Interrupt_Interrupt Handling - Fatal编程技术网

Operating system 为什么一个系统中有多个中断处理程序而不是一个?

Operating system 为什么一个系统中有多个中断处理程序而不是一个?,operating-system,kernel,interrupt,interrupt-handling,Operating System,Kernel,Interrupt,Interrupt Handling,在操作系统的内核中,我们有一个中断表,其中包含许多中断处理程序,用于处理来自I/O设备和进程的中断。但是为什么我们不能只有一个中断处理器呢?中断处理程序之间有什么不同吗?如果您有一个中断处理程序,那么如何处理中断的决定是在代码中而不是在硬件中做出的 还有很多事情会触发中断,因此代码几乎肯定会降低整体性能。如果您有一个中断处理程序,那么应该如何处理中断的决定是在代码中而不是在硬件中做出的 而且有很多东西可以触发中断-因此代码几乎肯定会降低总体性能。原则上,没有理由不使用一个中断处理程序来调用所有中

在操作系统的内核中,我们有一个中断表,其中包含许多中断处理程序,用于处理来自I/O设备和进程的中断。但是为什么我们不能只有一个中断处理器呢?中断处理程序之间有什么不同吗?

如果您有一个中断处理程序,那么如何处理中断的决定是在代码中而不是在硬件中做出的


还有很多事情会触发中断,因此代码几乎肯定会降低整体性能。

如果您有一个中断处理程序,那么应该如何处理中断的决定是在代码中而不是在硬件中做出的


而且有很多东西可以触发中断-因此代码几乎肯定会降低总体性能。

原则上,没有理由不使用一个中断处理程序来调用所有中断。这样的处理程序必须检查每个中断源。由于大多数情况下,只有一小部分可能的中断源处于活动状态,因此检查触发了哪个中断会浪费许多周期。由于ISR例程通常非常频繁地被称为代码,因此您将受到很大(可能不可接受)的性能影响

特定中断控制器处理中断的方式可能会有很大的不同。要获得非常扎实的理解,您必须阅读各种不同体系结构中断控制器实现的手册


然而,一些中断控制器最终共享一个公共ISR例程。公共ISR将读取中断控制器中的寄存器,以确定触发的向量(基本上是中断源)。然后,公共ISR调用另一个函数(通常也称为中断服务例程),该函数根据向量值处理特定的中断源。然后,根据向量特定例程将控制返回到公共ISR时中断控制器的实现情况,公共ISR将在中断控制器上解除中断,将执行返回到代码中的中断位置。因此,通过从中断控制器中的a寄存器读取向量,可以保存周期,因为公共ISR知道是什么导致了中断,而不是检查每个可能的中断源。

原则上,没有理由不能为所有中断调用单个中断处理程序。这样的处理程序必须检查每个中断源。由于大多数情况下,只有一小部分可能的中断源处于活动状态,因此检查触发了哪个中断会浪费许多周期。由于ISR例程通常非常频繁地被称为代码,因此您将受到很大(可能不可接受)的性能影响

特定中断控制器处理中断的方式可能会有很大的不同。要获得非常扎实的理解,您必须阅读各种不同体系结构中断控制器实现的手册


然而,一些中断控制器最终共享一个公共ISR例程。公共ISR将读取中断控制器中的寄存器,以确定触发的向量(基本上是中断源)。然后,公共ISR调用另一个函数(通常也称为中断服务例程),该函数根据向量值处理特定的中断源。然后,根据向量特定例程将控制返回到公共ISR时中断控制器的实现情况,公共ISR将在中断控制器上解除中断,将执行返回到代码中的中断位置。因此,通过从中断控制器中的a寄存器读取向量,可以保存周期,因为公共ISR知道是什么导致了中断,而不是检查每个可能的中断源。

另一个问题是,对于一个中断处理程序,对中断进行优先级排序变得非常混乱

通常,一旦中断被处理它的CPU确认,中断在硬件中就会被禁用,从而防止对同一中断的多次可重入调用以及可能发生的任何数据/缓冲区覆盖问题。对于中断处理程序来说,适当地重新启用较高优先级的中断也是很常见的,这样可以改善对这些中断的响应(然后它们可以中断较低优先级的中断)

如果可能的话,只使用一个中断处理程序会使中断的优先级变得非常混乱:(

让中断处理程序和驱动程序协调配合已经够困难的了

中断处理程序彼此有什么不同吗


嗯,是的。操作系统设计可能会迫使它们都遵守一组规则/约束,但是的,它们通常是不同的。管理磁盘DMA控制器中断的处理程序肯定会有不同于键盘输入处理程序的代码。首先,它们管理不同的硬件:)

另一个问题是,使用一个中断处理程序,对中断进行优先级排序会变得非常混乱

通常,一旦中断被处理它的CPU确认,中断在硬件中就会被禁用,从而防止对同一中断的多次可重入调用以及可能发生的任何数据/缓冲区覆盖问题。对于中断处理程序来说,适当地重新启用较高优先级的中断也是很常见的,这样可以改善对这些中断的响应(然后它们可以中断较低优先级的中断)

如果可能的话,只使用一个中断处理程序会使中断的优先级变得非常混乱:(

让中断处理程序和驱动程序协调配合已经够困难的了

你在插手吗