为了让内核能够快速响应硬件设备的消息,引入了中断机制。当硬件设备需要被处理(比如网卡收到了包),会发送一个异步的中断请求给处理器,然后处理器陷入中断上下文中,停止当前执行的程序,转而执行预先设定好的中断处理程序。完成中断处理程序之后给硬件设备一个信号再返回原先的工作继续。

在这套机制中,中断处理程序的编写非常关键。一方面,它必须完成对硬件中断响应的处理,比如网卡中断,要把缓冲区里的内容复制到内存,并且进行解析,然后返回给硬件,告诉硬件前一个中断已经处理掉了。在这个过程中,处理器陷入中断上下文,代码不可阻塞。另一方面,因为不可阻塞,中断响应程序必须尽可能短,以免错过接下来的中断。这样,既要处理的快,又要处理得多,就存在着速度与工作量的矛盾。

对此,解决方案是把中断处理程序拆分成两部分,上半部分和下半部分。上半部分负责处理紧急而简单的任务,例如告诉硬件中断已经处理了;下半部分负责处理与当前中断 相关的、繁重的、不是那么紧急的任务,比如对网卡收到的信息进行解析。上半部分要求接到中断立即执行,越快越好;而下半部分则不必立即执行,在系统比较空闲的时候(不一定是完全空闲,可以加入调度队列参与调度)再执行。

对于上半部分的实现,与嵌入式的中断机制类似,系统收到中断请求立刻执行。
————————————————
版权声明:本文为博主「他山之金」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。