中断#1:异步化

来源:互联网 发布:seo技术 编辑:程序博客网 时间:2024/05/22 17:04

概述

在计算机科学中,中断(Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断,这样的信号称为中断请求(Interrupt Request,IRQ)。在收到IRQ之后,处理器需要进行上下文切换,停止当前正在执行的代码,转而执行一段中断处理程序(Interrupt Handler,or Interrupt Service Routine, ISR)。ISR结束之后,恢复到之前的上下文。

Why Interrupt?

中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy Waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。

Interrupt Handler

当处理器收到一个IRQ,如何找到对应的IH?

在Intel 32位处理器之前,使用了中断向量表(Interrupt Vector Table,IVT),IVT共包含256个中断向量(IV),An Interrupt Vector is the memory address of an Interrupt Handler and it is also an index into IVT,每个IV大小为4个字节(可指向32位地址),这样整个IVT大小就是1KB。剩下的问题就是IVT的起始地址,Intel规定了在存储器地址空间中,最低的1KB空间是IVT,即00000H到003FFH。

到了后来的32位处理器,使用中断描述符表(Interrupt Descriptor Table,IDT)代替IVT,中断描述符(ID)代替IV。IVT最大的问题就是局限在最低的1KB空间,IDT则使用了中断描述符表寄存器(IDTR)来保存IDT的起始地址,这样便突破了这一限制。此外,ID相比IV,除了保存IH的内存地址,还有一些附加信息。

硬件实现

Intel 8259 是一系列的可编程中断控制器(Programmable Interrupt Controller,PIC)芯片的总称,当初设计它是为了搭配 Intel 8085 以及 Intel 8086 等微处理器来使用。

IR0-7 为中断请求输入引脚,与外部设备相连(8个输入引脚可对应2^8=256个中断向量);INT为中断输出引脚,与处理器相连,例如连接到8086的INTR引脚。

 

异步化编程

引入中断,从本质上来说,就是通过异步化,充分利用软硬件资源。

说到异步化编程,首先想到的便是node.js。从首页摘一段代码过来:

var net = require('net');var server = net.createServer(function (socket) {  socket.write('Echo server\r\n');  socket.pipe(socket);});server.listen(1337, '127.0.0.1');

这里的 function (socket) {...} 便可以理解为Interrupt Handler。

窃以为,这样的编程范式才是跟得上硬件发展的范式。此外,函数式编程在这方面的优势也值得探讨,例如Erlang,留待以后再作探究。

参考资料

  • http://zh.wikipedia.org/zh-cn/中斷
0 0
原创粉丝点击