程序中断方式

概述

计算机在执行程序得过程中,当出现异常情况或特殊请求时,计算机停止现行程序((正在运行的程序)),转向对这些异常情况或特殊请求得处理,处理后再返回到现行程序的间断处。

由于CPU和IO设备速度的不匹配,CPU通常要等待一段时间,才能实现主机与IO设备之间的信息交换。所以当CPU启动了IO设备之后,就转去执行现行程序,让IO设备准备好后主动通知(中断)CPU,CPU转去执行中断程序,进行数据交换。这就是IO中断。

打印机的中断

中断方式的电路

中断请求触发器和中断屏蔽触发器

每台外部设备都必须配置一个中断请求触发器INTR,当其为“1”时,表示该设备向CPU提出中断请求。同时也需要一个配对的 中断屏蔽器,用于屏蔽一些低优先级的中断请求(面对多个中断请求时),当它为“1”时,表示封锁其中断源。其电路逻辑图如下所示

接口电路中D、INTR、MASK和中断查询信号的关系

当设备准备就绪D为“1”、且该设备MASK不为“0”时,由CPU在指令执行结束阶段时,由CPU发出中断查询信号,将INTR设置为“1”

排队器

当多个中断源同时向CPU发出请求时,CPU会根据中断源的不同性质对其排队,给予不同等级的优先权,并按优先级等级给予响应。

通常来说速度越快的IO设备,优先级越高,因为不及时响应高速的IO请求,信息可能会发生丢失。

排队器分为硬件排队器和软件排队器:这里只介绍硬件排队器,下图是硬件排队器的电路

链式排队器

当各个中断源无请求时,各个INTR-均为高电平。一旦某个中断源提出中断请求时,就会让优先级低的中断源变为低电平,封锁其中的中断请求。比如当2、3号中断源同时有请求时(INTR2-、INTR3-均为0),流程如图所示

链式排队器距离图

INTRi- 没有提出请求时均为高电平,根据例子,二、三号中断源提出请求,二、三号输入低电压,由于二号经过与非门输出高电压,经过三号的非门,输出低电压,让三号无法被选。此时因为INTP1和INTP2输出都为高电压,又通过INTPi来和输出信号进行与运算,最终输出INTP2

中断向量地址形成部件(设备编址器)

CPU一旦响应了IO中断,就要暂停现行程序,转去执行该设备的中断服务程序。不同的设备有不同的中断服务程序,每个服务程序都有一个入口,而CPU需要通过设备编址码找到中断服务程序实际所在的位置。

设备编址码的输入是来自排队器的输出INTPi,它的输出是中断源的位置

设备编码器

比如编址器输出12H,CPU就能从主存的12H的位置查找(假设是统一编址),找到对应的中断服务程序的入口地址

IO中断处理过程

中断的条件和时间

  1. CPU中的EINT(允许中断触发器)为“1”,该触发器用开中断置位,用关中断使其复位
  2. CPU响应中断的时间一定是在每条指令执行阶段的结束时刻

接下来以输入设备为例,结合流程示意图进行讲解,流程图如下所示
中断流程图

当选中设备后,设备选择电路发出SEL信号

  1. CPU发出启动命令,将触发器B置为“1”,D为“0”
  2. 接口启动输入设备,设备开始工作
  3. IO设备将数据送入数据缓冲寄存器
  4. 当输入设备发出设备工作结束信号后,D被置为“1”,B被置为“0”,标志设备准备就绪
  5. 当设备准备就绪,且本设备未被屏蔽时,在指令执行结束阶段,CPU会发出中断查询信号
  6. 设备中断请请求触发器INTR被置为“1”,向CPU提出中断请求,INTR送至排队器,进行中断判优
  7. 若CPU允许中断(ENIT=1),设备又被排队选中,即进入中断响应阶段,由中断响应信号INTA将排队器输出送至编码器形成的向量地址
  8. 向量地址送至CPU,作为下一条指令的地址
  9. 向量地址里存放的是无条件转移指令(看中断流程图),待转移指令执行完毕,就转去对应设备的服务程序入口地址,开始执行中断服务程序,通过输入指令将数据缓冲寄存器的输入数据送至CPU的通用寄存器,再存入主存相关单元
  10. 中断服务程序的最后一条指令是中断返回指令,当其执行结束时,中断返回至原程序的断点处。

中断服务程序的流程

总共分为四个阶段

  1. 保护现场
  2. 中断服务
  3. 恢复现场
  4. 中断返回

保护现场

其一是保存程序的断点,其二是保存通用寄存器和状态寄存器的内容。前者涉及到中断隐指令,后者由中断服务程序完成。中断服务程序会在程序的起始部分安排若干条存数指令,将寄存器的内容存至存储器中保存;或者用进栈指令将各个寄存器的内容压入堆栈中保存。

中断服务

不同的设备中断服务不一样,比如打印机要求CPU将需要打印的字符代码送入打印机的缓冲器内;显示器设备要求CPU将需要显示的字符代码送入显示存储器中

恢复现场

在中断服务程序退出前,将中断的现行程序恢复回来。通常可用取数指令或出栈指令,将保存在存储器中的信息送回到原来的寄存器中

中断返回

中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处

单重中断和多重中断

当CPU响应了一个中断源的中断请求后,EINT会被置为“0”,无法让其他中断源继续请求。对于单重中断,在保护完现场后,即刻去执行设备服务,直到恢复完现场后,才将EINT置为“1”并返回。而对于多重中断来说,在保护完现场后,就立刻将EINT设置为“1”,允许其他中断源插入中断请求。示意图如下所示

单重中断和多重中断

多重中断就和方法里面再调用其他方法一样,如下图所示
嵌套调用

总结

从宏观上看,中断方式克服了程序查询方式的原地踏步,CPU和IO设备是并行操作的,提高了CPU的资源利用率

从微观上看,CPU在处理中断服务程序时仍然需要暂停原程序的运行,尤其是当高速IO或辅助存储器频繁地与主存交换信息时,需要不断打断CPU执行主程序而执行中断服务程序。

主程序和服务程序抢占CPU资源

为了完善中断程序,人们提出了DMA控制方式。