计算机软考程序员教程:输入输出方式
在计算机系统中,有多种输入输出方式,包括程序控制、中断、DMA和通道等。那这多种输入输出方式具体内容有哪些呢?
1. 程序控制工作方式
指在程序的控制下进行数据传送,是CPU与外设之间交换信息的最简单形式,包括:
(1)无条件传送方式。传送数据之前不查询外设状态而直接执行输入或输出命令,这种方式下的外设总处于"待命"状态,可根据其固定的或已知的时序,将I/O指令插在程序中,当程序执行到该条指令时,就开始输入或输出数据。这种方式最简单,但是可靠性不高。
(2)条件传送方式。也称为查询传送,CPU通过执行程序不断读取并测试外设状态,若输入设备处于准备好状态或输出设备处于空闲状态,则CPU执行I/O指令与外设交换信息,这要求接口电路中除了有数据端口外,还要有状态端口。它比无条件传送可靠,使用面也广,但这种方式要求CPU不断检测外设状态,占用了CPU大量时间,效率不高。
2. 中断工作方式
中断方式可以克服查询方式的低效问题,当CPU执行到I/O请求时,向I/O控制器发出相应指令后,CPU并不等待,而是继续执行其它操作。由于CPU无需等待I/O控制器与外设的数据交换,所以效率得到了提高。
中断是指在CPU执行程序的过程中,由于某一外部或CPU内部事件的发生,使CPU暂时中止正在执行的程序,转去处理这一事件,当该事件处理完毕后又回到原先被中止的程序,接着中止前的状态继续向下执行。
引起中断的事件称为中断源。其中,由CPU内部产生的中断称为内部中断,它包括溢出中断、除法错中断、断点中断、软中断及单步中断;由CPU外部产生的中断称为外部中断,它包括可屏蔽中断和非屏蔽中断。
CPU接到中断请求后,如果是当前允许的中断,那么要停止正在执行的代码,并把内部寄存器入栈,这个过程不能再次被打断,所以要先关中断,入栈完后再开中断。这个过程应该尽量短,以防止错过了其它中断,该过程消耗的时间称为中断响应时间。然后再执行中断处理程序,一般都比较简单,就是设置一些标志位,做简单的数据处理而已,其它更耗时的处理由非中断程序完成。中断处理完成后要恢复现场,把入栈寄存器出栈,继续执行被中断的程序,这个过程消耗的时间称为中断处理时间,该时间大小与中断类型、应用类型有关,也不是一味求短,现在大多数CPU都支持多极中断,在执行中断时还可以响应其它中断,形成中断嵌套。
当有多个中断源时,通常采用下述方法确定需要处理的中断:
(1)直接相连法:每个中断源使用自己的中断请求信号和CPU相连,由于CPU的外部中断引脚个数有限,所以这种方式适用于中断源不是很多的情况。
(2)统一的中断请求:由CPU使用专门程序一次判断是哪个中断源的请求,通过查询的次序,可以实现中断的优先级控制。
(3)硬件查询法:由一条中断确认信号链和输入、输出设备相连,某个外设发出中断请求后,中断确认信号开始在各外设间传递,发出中断请求的外设响应这个信号。
(4)总线仲裁:外设需先得到总线控制权,发出中断请求,最后将设备号通过数据总线发给CPU,由总线仲裁机制决定可以发信号的外设。
(5)中断向量表:是一张保存不同中断处理程序入口地址的表格,里面的记录称为"中断向量",CPU根据中断号查询该表,可以得到中断处理程序的入口地址。
3. DMA工作方式
该方式采用DMA控制器DMAC执行数据传送,DMAC从CPU处接管系统总线控制权,发出控制信号使数据通过总线直接在存储器和I/O设备之间进行传送。其工作过程如下:
(1)I/O设备向DMAC发出DMA请求信号,要求进行数据传送。
(2)DMAC向CPU发出总线请求信号HRQ.
(3)CPU完成当前总线周期后,暂停操作,向DMAC发响应DMA请求的回答信号HLDA,并交出总线控制权,由DMAC接管总线。
(4)DMAC向存储器发存储器地址信号。
(5)DMAC发读/写控制信号,在存储器与I/O设备之间传送一个字节数据。
(6)每传送一个字节,DMAC的地址寄存器加1.字节计数器减1.
(7)检测传送是否结束,若为结束则转入(4)继续数据传送,否则DMAC将总线控制权交还给CPU,CPU继续原来的操作。
因为DMA方式仅仅在需要占用总线传送数据时才暂停CPU操作,因此CPU的工作效率极高。虽然DMAC能够代替CPU接管总线执行数据传送,但二者还是有很大的差别。CPU能识别系统指令,具有运算判断、处理各种事件的能力,它不但使用总线还管理总线。而DMAC只能识别少数几种命令字,其主要功能是完成数据传输,它想使用总线时必须向CPU发出申请。
4. 通道控制方式
通道是一种专用控制器,它通过执行通道程序进行I/O操作管理,为主机与I/O设备提供一种数据传输通道。用通道指令编制的程序存放在存储器中,当需要进行I/O操作时,CPU只要按约定格式准备好命令和数据,然后启动通道即可;通道则执行相应的通道程序,完成所要求的操作。用通道程序也可完成较复杂的I/O管理和预处理,从而在很大程度上将主机从繁琐的I/O管理工作中解脱出来,提高了系统效率。