中断和处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/89976789

一、中断

中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接受到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步,换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断

 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志。

二、中断处理程序

  在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一个函数专门处理由键盘产生的中断。一个设备的中断处理程序是它设备驱动程序的一部分,设备驱动程序是用于对设备进行管理的内核代码

  中断可能随时发生,因此中断处理程序也就随时可能执行。所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快的恢复中断代码的执行。因此,尽管对硬件而言,操作系统能迅速对其中断进行服务非常重要。当然对系统的其他部分而言,让中断处理程序在尽可能短的时间内完成运行也同样重要。最起码的,中断处理程序要负责通知硬件设备中断已接收:嗨,硬件,我听到你了,现在回去工作吧!但是中断处理程序往往还要完成大量其他的工具。例如:我们可以考虑以下网络设备的中断处理程序面临的挑战。该处理程序除了要对硬件应答,还要把来自硬件的网络数据包拷贝到内存,对其进行处理后再交给合适的协议栈或应用程序。显而易见,这种工作量不会太小,尤其对于如今的千兆比特和万兆比特以太网卡而言

三、上半部与下半部的对比

  又想中断处理程序运行的快,又想中断处理程序完成的工作量多,这两个目的显然有所抵触,因此我们一般把中断处理切为两个部分或两半。中断处理程序是上半部:接收到一个中断,它就会立即开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件,这些工作都是再所有中断被禁止的情况下完成的,能够被允许稍后完成的工作会推迟到下半部去。此后,在合适的时机,下半部会被中断处理程序返回后执行。

  举例:以网卡作为实例。当网卡接收来自网络的数据包时,需要通知内核数据包到达了。网卡需要立即完成这件事,从而优化网络的吞吐量和传输周期,以避免超时。因此网卡立即发出中断:嗨,内核,我这里有最新的数据包了。内核通过执行网卡已注册的中断处理程序来做出应答。

  中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包。这些都是重要、紧迫而又与硬件相关的工作。内核通常需要快速的拷贝网络数据包到达系统内存,因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。所以上述拷贝动作一旦被延迟,必然造成缓存溢出,因为进入的网络包占满了网卡的缓存,后续入的包只能被丢弃。当网络数据包被拷贝到系统内存后,中断的任务算是完成了,这时它将控制权交还给系统被中断前的程序,处理和操作数据包的其他工作在随后的下半部中进行

四、为什么要用下半部?下半部执行的时间是什么时候呢?

  (1)因为希望尽量减少中断处理程序中需要完成的工作量,因为当它在运行的时候,当前的中断线在所有处理器上都会被屏蔽。缩短中断被屏蔽的时间对系统的响应能力和性能都至关重要。再加上中断处理程序要与其他程序(甚至是其他的中断处理程序)异步执行,所以很明显,我们必须尽力缩短中断处理程序的执行。解决的方法就是把一些工作放到以后去做。

(2)具体放到什么时候去做呢?这里的以后仅仅用力来强调不是马上而已。下半部分并不需要指明一个确切的时间,只要把这些任务推迟一点,让他们在系统不太繁忙并且中断恢复后执行就可以了。通常下半部分在中断处理程序一反回就会马上运行。下半部分执行的关键在于当他们运行的时候,允许响应所有的中断。这种设计可以使系统处于中断屏蔽状态的时间尽可能地短,以次来提高系统地响应能力。

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/89976789
今日推荐