I/O设备较少,I/O设备与主存交换信息都必须通过CPU,每一个I/O设备都具有一套独立的逻辑电路与CPU相连,用来实现I/O设备与主机之间的信息交换,线路十分散乱复杂,而且由于I/O设备与主机交换信息时,CPU只能停止运算,即I/O设备与CPU是按照串行方式进行工作的,减低了工作效率,再者,由于每一个I/O设备的逻辑控制电路与CPU的控制器已经构成了一个不可分割的整体,于是进行I/O设备的增添、撤减是极其困难的
计算机系统采用了总线结构,I/O设备通过接口模块与主机相连接,而且通常在接口中都设有数据通路和控制通路,数据经过接口既可以起到缓冲作用,又可以实现串并变换,控制通路用以传送CPU向I/O设备发出的各种控制命令,或者使CPU接收来自I/O设备的反馈信号。许多接口还能满足中断请求处理的要求,使得I/O设备与CPU可以按照并行方式进行工作(虽然并不是绝对的并行工作),提高了CPU的工作效率,此外接口技术还可以实现多台I/O设备分时占用总线,使得I/O设备之间也可以实现并行工作方式,提高了整机效率
为了进一步提高CPU工作效率,又出现了DMA(直接存储器存取)技术,特点是I/O设备与主存之间存在一条直接数据通路,I/O设备可以与主存直接交换信息,使得CPU在I/O设备与主存交换信息这个时间段内可以继续完成自身工作,资源利用率得到了进一步的提升
采用DMA方式虽然可以实现高速I/O设备与主机之间成组数据的交换,但是在大型计算机中使用DMA方式就会出现一些问题:
I/O处理机又称为外围处理机,基本独立于主机工作,既可以完成I/O通道要完成的I/O控制,又可以完成码制变换、格式处理、数据块检错、纠错等操作。具有I/O处理机的输入输出系统与CPU工作的并行性更高,I/O系统对于主机来说具有更大的独立性
不同结构的输入输出系统所采用的软件技术差异很大:在采用接口模块方式时,使用机器指令系统中的I/O指令与系统软件中的管理程序即可实现I/O设备与主机的协调工作,在采用通道管理方式时,除了要使用I/O指令之外,还需要使用通道指令以及相应的操作系统。就算都采用操作系统,不同的机器其操作系统的复杂程度差异也是很大的。
I/O指令为机器指令的一类,为CPU指令系统的一部分,是CPU用来控制输入输出操作的指令,由CPU译码以后执行。I/O指令可以和其他机器指令的字长相同,但是也是会反映CPU与I/O设备交换信息的特点,比如反映出对多台I/O设备的选择以及应该对设备进行哪些具体操作
通道指令又称为CCW(通道控制字),是对具有通道的I/O系统为通道专门设置的指令,在具有通道结构的计算机中,I/O指令主要完成I/O设备的启动、停止操作、查询通道和I/O设备状态以及控制通道所做的其他操作,不实现I/O数据的传送操作,这种具有通道指令的计算机一旦CPU执行了启动I/O设备的指令,通道就会替代CPU对I/O设备进行管理。通道指令一般用来指明参与传送的数据在主存中的首地址;指明需要传送的字节数或者所传送数据的末地址;指明所选设备的设备码以及完成某种操作的命令码。一般位数比较多,通道程序即由通道指令所构成,用来完成某种外围设备与主存之间传送信息的操作
输入输出系统的硬件组成是多样的,在带有接口的I/O系统中,一般包括接口模块以及I/O设备两大部分;在具有通道的I/O系统中,一个通道可以和一个以上的设备控制器相连,一个设备控制器又可以控制若干台同一类型的设备
I/O设备与主机交换信息和CPU与主存交换信息相比,有许多不同点。例如,CPU如何对I/O设备编址;如何寻找I/O设备号;信息传送是逐位串行还是多位并行;I/O设备与主机以什么方式进行联络,使它们彼此都知道对方处于何种状态;I/O设备与主机是怎么连接的,等等。这一系列问题统称为I/O设备与主机的联系方式
通常将I/O设备码看作地址码,对I/O地址码的编址可以采用统一编址和不统一编址两种方式
由于每一台I/O设备都被赋予了一个设备号,于是,要启动某一台设备是可以由I/O指令的设备码字段直接指出该设备的设备号。通过接口电路中的设备选择电路,即可选中要进行信息交换的I/O设备
立即响应方式
异步工作采用应答信号联络
当I/O设备与主机工作速度不匹配的时候,通常采用异步工作方式,这种方式下,I/O设备与CPU只有在出现联络信号的时候,才会开始准备交换信息
并行传送的异步联络方式
串行传送的异步联络方式
同步工作采用应答信号联络
辐射式
总线式
I/O设备与主机交换信息具有5种控制方式:程序查询方式、程序中断方式、直接存储器方式(DMA)、I/O通道方式、I/O处理机方式。后面两种不在此处介绍,只介绍前面三种,皆使用外部数据输入的案例进行讲解。三种方式逐步使I/O设备的自治能力越来越强
CPU在要对I/O设备进行读操作的时候,就会通过程序不断查询I/O设备是否已经准备就绪,从而实现I/O设备与主机的数据交换过程。采用这种方式,要求I/O接口内设置一个能够反映I/O设备是否准备就绪的状态标记,CPU通过对此标记的检测即可得知I/O设备的准备情况,实现电路简单
图中为CPU从某一个I/O设备读数据块(比如从磁盘上读取一个记录块)到内存中的查询方式流程,当现行程序需要启动某一个I/O设备读取信息的时候,就会将此程序流程插入到运行的程序中
从流程图中即可看出,只要一启动I/O设备,CPU就会不断查询I/O设备的准备情况,从而终止了原理程序的执行过程,这是一个原地踏步的过程,而且在I/O设备准备就绪以后,CPU要一个字一个字地从I/O设备中取出数据,经过CPU送到主存中,这个过程中依旧不能执行原程序,可见这种I/O设备与主机信息传送的控制方式使得CPU与I/O设备处于串行工作状态,CPU工作效率不高
程序中断方式中,CPU在启动I/O设备以后并不会一直停留在原地,不断发送查询信息,而是不管I/O设备的准备状态,继续执行现行程序,直到I/O设备准备就绪了,I/O设备会自动向CPU发送中断请求,这个时候CPU才会进行I/O设备设备情况的查询,对现行程序进行中断,转而执行中断服务程序,等待与I/O的信息传输完毕以后,会返回原程序断点处,继续执行原程序,由于这种I/O设备与主机信息传送的控制方式使得原程序中断了运行,于是这种方式被称为程序中断方式
如果系统挂接的设备的数目和种类不多,而且CPU不忙,则使用程序查询法实现数据的输入输出较为适合
从流程图中可以看出,CPU在接收了I/O设备的中断请求以后,才会从I/O接口一个字一个字地将数据写入主存中(这是通过执行中断程序而不是现行程序完成的),CPU与I/O设备为部分并行工作,如果I/O设备的一个数据块中的全部数据尚未传输结束的时候,CPU会再次启动I/O设备,命令I/O设备再进行准备,传输数据,一旦又接收到I/O设备的中断请求时,CPU会重复上述过程,直到一个数据块中的全部数据传输完毕。采用程序中断方式的时候,CPU和I/O接口不仅在硬件方面需要增加相应的电路,在软件方面还必须编制中断服务程序。要保证在CPU中断程序,后续返回之后能够能正确地继续执行下去,中断时要保存现场,保存程序断点,返回时要恢复现场,恢复程序断点,这些都是需要一定时间的
DMA方式下,I/O设备与主存之间具有一条专门的数据通路,可以直接与主存交换现行,而不需要占用CPU资源(即CPU不需要暂停现行程序去为设备服务,省去了保护现场和恢复现场的过程),CPU的资源利用率将进一步提高。如果出现了DMA和CPU同时访问主存的情况,CPU总是将总线占用全让给DMA,通常将DMA的这种占用称为"窃取"或者"挪用",窃取的时间一般为一个存取周期,故又把DMA占用的存取周期称为"窃取周期"或者"挪用周期",在挪用周期中,CPU可以进行内部的操作(比如乘法运算),即与程序查询和程序中断方式相比,DMA方式进一步提高了CPU资源的利用率,基本上实现了CPU与I/O设备的并行工作。同时也是有一些不足之处的,在本文的开头处有略微提及,这里不再叙述
DMA方式实际上是把输入/输出过程中外设与内存交换数据的那部分操作与控制交给了DMAC(DMA控制器),从而简化了CPU对输入/输出的控制。在程序查询方式或者程序中断方式是通过CPU执行指令实现数据传送的(即通过软件控制实现),数据必须要通过CPU进行中转,而在DMA方式中,都是使用硬件DMAC进行I/O设备与内存之间的数据传送的,由DMA控制器实现内存和外设,或者外设与外设之间的直接快速数据传送
DMA方式的最大优势就在于速度快,这对于高速率大批量数据传送特别有用,所以DMA传送主要用于需要高速大批量数据传送的系统中,以提高数据的吞吐量,如磁盘存取、图像处理、高速数据采集系统、同步通信中的收发信号等方面应用甚广。DMA传送方式的优点是以增加系统硬件的复杂性和成本为代价的,电路结构复杂,硬件开销大。
DMA传送虽然脱离了CPU的控制,但是并不是说DMA传送的整个过程就不需要进行控制和管理了,通常是采用DMA控制器(DMAC)取代了CPU,负责DMA传送的全过程控制。当外设准备好数据以后,就会向DMA控制器发送DMA请求,进而DMA控制器就会向CPU发送总线占有请求。在系统同意让出总线的情况下,高速外设就可以利用总线在DMA控制器的控制下完成数据交换。DMA数据交换的根本就是需要获得总线控制权
"接口"可以看作是两个系统或者两个部件之间的交接部分,既可以是两种硬设备之间的连接电路,也可以是两个软件之间的共同逻辑边界,还可以是硬件和软件的边界
I/O接口通常是指主机与I/O设备之间设置的一个硬件电路及其相应的软件控制,不同的I/O设备都具有其相对应的设备控制器,它们往往都是通过I/O接口与主机取得联系的。值得注意的是,"接口"和"端口"是两个不同的概念,端口指的是接口电路中的一些寄存器(一个接口内部可以具有多个端口),这些寄存器分别用来存放数据信息、控制信息、状态信息,相应的端口分别称为数据端口、控制端口、状态端口(不同的端口用于传输不同的类型的信息)。若干个端口加上相应的控制逻辑才能组成接口。CPU通过输入指令,从端口读入信息,通过输出指令,可以将信息写入端口中(每一个I/O端口都会被分配一个I/O端口地址,简称I/O地址)
使得CPU与外部设备进行通信的I/O接口电路一般称为I/O硬件,系统要通过这个I/O接口电路实现设备和I/O接口的通信,还需要编写相应的程序,一般将这个程序称为I/O软件,对于I/O硬件和I/O软件的综合设计称为I/O接口技术
分类(按照数据传送方式不同)
分类(按照功能选择的灵活性不同)
分类(按照通用性不同)
分类(按照数据传送的控制方式不同,程序查询方式不需要特殊的接口)
通常需要执行三条指令
在计算机执行程序的过程中,当出现异常情况或者特殊情况时,计算机停止现行程序的执行,转向对这些异常情况或者特殊请求的处理,处理完毕以后在返回到现行程序的间断出,继续执行原程序,这就是"中断"
中断是现代计算机可以有效合理得发挥效能和提高效率的一种十分重要的功能。CPU总是在统一的时间,即每一条指令执行阶段的最后时刻,查询所有设备是否发送了中断请求。由于向CPU提出中断请求的原因越来越多,把向CPU提出中断请求的各种原因统称为中断源
完成触发器D
中断请求触发器
中断屏蔽触发器
前三者之间的关系
排队器
中断向量地址形成部件(设备编码器)
不同的设备具有不同的中断服务程序,同时每一个服务程序都具有一个入口地址,CPU必须找到这个入口地址,才能执行中断服务程序,入口地址的寻找可以使用硬件也可以使用软件,这里仅介绍硬件向量法
硬件向量法
CPU响应中断请求
CPU在执行主程序的过程中,执行到一条输入指令,这条输入指令要求指定的外部设备把数据输入到主机中
CPU通过这条指令,在地址线上给出对应设备地址,设备地址送入对应的接口电路当中后,接口利用设备选择电路,对设备地址进行比较,如果相同,该接口以及该接口相连接的设备就被选中的了,SEL信号有效,接口电路开始工作
由CPU发送启动设备命令,和SEL信号同时有效,经过译码以后,将接口中的B置"1",D置"0",表示设备开始准备数据,设备进入忙状态
B为"1"使得该接口所连接的输入设备开始准备数据
输入设备将数据送入数据缓冲寄存器
输入设备向接口发送"设备工作结束信号",将接口中的B置"0",D置"1",标志设备工作结束,数据准备完毕,设备准备就绪,设备退出忙状态
设备准备就绪(D=1),且本设备未被屏蔽(MASK=0),同时在CPU的指令执行阶段的结束时刻,由CPU发送了中断查询信号
在中断查询信号的作用下,设备中断请求触发器INTR置"1",标志设备向CPU成功发送了中断请求,于此同时,INTR送至排队器,进行中断判优过程,排队器的众多输出信号中只有一个信号是有效的
如果CPU允许中断(即允许中断触发器EINT值为"1"),标志设备中断请求成功,CPU发送中断响应信号,设备进入了中断响应阶段,由中断响应信号INTA将排队器的所有输出作为设备编码器的输入信号,设备编码器输出向量地址,向量地址通过数据总线送至CPU,作为CPU要执行的下一条指令的地址
如果向量地址对应的内存空间中存放的是一条无条件转移指令,这一条指令执行完毕以后,会无条件转至内存中该设备的中断服务程序处,开始执行中断服务程序,进入中断服务阶段,其中在保护现场阶段过后,进行屏蔽字设置(涉及到接口的中断屏蔽触发器)和关中断(涉及到CPU的允许中断触发器)的操作。开始进行数据的传输过程,即通过输入指令将数据缓冲寄存器的输入数据送至CPU的通用寄存器中,再通过CPU存入主存
中断服务程序的最后一条指令为中断返回指令,当其执行结束的时候,中断返回至原程序断点处,至此,一个完整的程序中断处理过程结束
一次中断处理过程可以简单归纳为中断请求、中断判优、中断响应、中断服务和中断返回5个阶段
有些同学可能会有疑问:为什么这里的设备编码器看起来只有一个INTP输入,而前面讲述排队器的时候,示意图中具有多个INTP输入呢?
因为这里仅仅指画出了一整个编码器的一小部分而已,整体的编码器应该如下图所示,这里采用的排队器是每个接口电路中分别设置各个设备的排队器,是一个链式排队器,重点看设备译码器处,是所有的排队器的输出信号(只有一个信号是有效的)进入一个设备编码器(即中断向量地址形成部件)中
不同设备的中断服务程序各不相同,可是它们的程序流程又是类似的
一般中断服务程序的流程可以分为四大部分:保护现场、中断服务、恢复现场、中断返回
CPU一旦响应了某一中断源的请求,硬件线路就会自动关中断,即允许触发器EINT置"0",以确保该中断服务程序的顺利进行,此时如果此时不使用"开中断"指令将EINT置"1",则意味着CPU不能再响应其他任何一个中断源的中断请求。多重中断和单重中断这两种不同处理方式的区别,就是"开中断"的设置时间不同
单重中断
多重中断
DMA方式中,主机与I/O设备的DMA接口具有一条直接的数据通路,因此在主存与I/O设备交换信息时,不需要通过CPU,也不需要CPU暂停现行程序为设备服务,省去了保护现场和恢复现场的操作,因此CPU的工作效率得到了很好的提升
DMA方式特别适合与高速I/O设备或辅存与主存之间进行现行交换,因为高速I/O设备如果需要申请与主机交换信息,即要等待CPU做出中断响应以后才能进行信息传递,则很有可能在这段时间内,数据就丢失了
在DMA方式中,由于DMA接口与CPU共享主存,于是就可能发生两者争用主存的冲突,为了有效地分时使用主存,解决发生的冲突,通常DMA接口与主存交换数据实现下面三种方法
这种方法下,如果外部设备要求传送一批数据,就会由DMA接口向CPU发送一个停止信号,要求CPU放弃地址线、数据线和有关控制线的使用权,在DMA接口获得总线控制权以后,就会开始就进行持续的数据传送,在数据完全传送结束以后,DMA接口才会通知CPU可以实现主存,并把总线控制权交还回CPU
这种方法的优点是控制简单,适用于数据传输率很高的I/O设备实现成组数据的传输。缺点是DMA接口在访问主存的同时,CPU基本处于一个长时间不工作的状态,或者保持原状态(当然,如果在CPU内部的指令缓冲器当中具有指令或者指令已经被取入到Cache,只要执行指令的过程中,不访问主存,CPU还是可以继续工作的),而且即使I/O设备高速允许,但是两个数据之间的准备间隔时间也总是大于一个存取周期的时间的,而这一段时间内,主存处于一个空闲的状态,而CPU也不能对主存进行访问,于是主存的利用率就没有得到充分的发挥
这种方法中,每当I/O设备发送DMA请求的时候,I/O设备只能得到一个或者几个主存周期的总线占用权
I/O设备向CPU发送DMA请求的时候,会有三种情况
这种方法于CPU暂停访存的方法相比,既实现了I/O传送,又可以较好地发挥了主存与CPU的效率,是一种广泛采用的方法,但是同时I/O设备每挪用一个主存周期就要进行申请总线控制权、建立总线控制权和归还总线控制权这些步骤,因此,即使传送一个字的过程对于主存来说只需要占用一个主存周期,实际上,对于DMS接口来说,因为总线控制权的问题,这一整个过程需要消耗2-5个主存周期,因此周期挪用的方法比较适合于I/O设备的读写周期要大于主存周期的情况
这种方法适合于CPU的工作周期比主存的存取周期要长的情况,这样一个CPU的工作周期就可以分为前后两段,一个用来专门进行DMA访存,一个用来专门进行CPU访存
这种方法不需要进行总线使用权的申请、建立和归还的过程,总线使用权是通过CPU工作周期的两部分进行拥有者的区分的,实际上,总线变成了在两段时间控制下的多路转化器,而这个转移过程基本不需要花费多少时间,这种方法下,CPU既不需要停止主程序的运行,也不需要进入等待状态,就可以完成DMA数据的传送。当然,其相应的硬件逻辑变得更加复杂了,CPU和DMA接口各自具有独立的访存地址寄存器、数据寄存器和读/写信号
利用DMA方式传送数据时,数据的传输过程完全由DMA接口电路所控制,于是DMA接口又称为DMA控制器
在DMA接口开始工作之前,CPU必须要通过几条I/O指令完成下列信息的预置,实现预置以后,CPU会继续执行原来的程序,而如果I/O设备准备就绪,DMA接口就会向CPU提出占用总线的申请,如果同时有多个DMA进行申请,则按照事情的轻重缓急由硬件排队判断优逻辑决定优先级。等到I/O设备得到主存总线占有权以后,DMA接口就会开始对数据的传送进行管理
DMA方式是以数据块为单位进行传送的,以周期挪用的DMA方式为例,对数据传送的流程进行讲解
当DMA的中断请求得到响应以后,CPU停止原程序的执行,转而去执行中断服务程序,做一些DMA的结束工作,包括