一.I/O控制方式
上一篇的博客介绍了设备管理的一些概念基础知识点,其中I/O控制方式这一块没有详细说明。设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。外围设备和内存之间的输入/输出控制方式有4种,下面分别加以介绍。
二.程序直接控制方式
也叫程序查询方式。
信息交换的控制完全由CPU执行程序实现,程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(状态端口)。主机进行I/O操作时,先发出询问信号,读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待。
程序查询方式的工作流程如下:
- ①CPU执行初始化程序,并预置传送参数。
- ②向I/O接口发出命令字,启动I/O设备。
- ③从外设接口读取其状态信息。
- ④CPU不断查询I/O设备状态,直到外设准备就绪。
- ⑤传送一次数据
- ⑥修改地址和计数器参数。
- ⑦判断传送是否结束,若未结束转第③步,直到计数器为0。
如图所示,计算机从外部设备读取的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器中。在程序直接控制方式中,由于CPU的高速性和IO设备的低速性,致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成了CPU资源的极大浪费。在该方式中,CPU之所以要不断地测试I/O设备的状态,就是因为在CPU中未采用中断机构,使1/O设备无法向CPU报告它已完成了一个字符的输入操作。
在这种控制方式下,CPU一旦启动I/O,就必须停止现行程序的运行,并在现行程序中插入一段程序。程序查询方式的主要特点是CPU有“踏步”等待现象,CPU与I/O串行工作。这种方式的接口设计简单、设备量少,但CPU在信息传送过程中要花费很多时间来查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。
个人理解:这种程序直接控制方式,CPU只能干这一件事,CPU干涉频繁,好像没了CPU什么也做不了,且每次传送都是一个字,这也显示了他的缺点效率低,耗时;而这么做,逻辑很简单,所以接口设计简单,易于实现。
三.程序中断方式
也叫中断驱动方式。
1.程序中断
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,处理完毕后再返回到现行程序的断点处,继续执行原程序。
早期的中断技术是为了处理数据传送。随着计算机的发展,中断技术不断被赋予新的功能,主要功能有:
- ①实现CPU与I/O设备的并行工作。
- ②处理硬件故障和软件错误。
- ③实现人机交互,用户干预机器需要用到中断系统。
- ④实现多道程序、分时操作,多道程序的切换需借助于中断系统。
- ⑤实时处理需要借助中断系统来实现快速响应。
- ⑥实现应用程序和操作系统(管态程序)的切换,称为“软中断”。
- ⑦多处理器系统中各处理器之间的信息交流和任务切换。
那么,中断程序中断方式也就是中断技术第一种功能的实现。程序中断方式的思想: CPU在程序中安排好在某个时机启动某台外设,然后CPU继续执行当前的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU返回原来的程序。
从/0控制器的角度来看,I/O 控制器从CPU接收一个读命令,然后从外部设备读数据。一旦数据读入I/O控制器的数据寄存器,便通过控制线给CPU发出中断信号,表示数据已准备好,然后等待CPU请求该数据。I0 控制器收到CPU发出的取数据请求后,将数据放到数据总线上,传到CPU的寄存器中。至此,本次IO操作完成,I/O 控制器又可开始下一次I/O操作。
从CPU的角度来看,CPU发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器及处理机寄存器),转去执行其他程序。在每个指令周期的末尾,CPU检查中断。当有来自IO控制器的中断时,CPU保存当前正在运行程序的上下文,转去执行中断处理程序以处理该中断。这时,CPU从IO控制器读一个字的数据传送到寄存器,并存入主存。接着, CPU恢复发出IO命令的程序(或其他程序)的上下文,然后继续运行。
在这个方式里虽然主存与外设(外存也可以看作是一种外设,比如磁盘)的数据传递还是以字为单位,但是CPU不用一直等待外设数据传送完毕,在发出读命令后,它可以执行其他的程序,而外设传送完一个字数据后就向CPU发送一个中断请求,CPU就知道外设数据传递完了,此时再回来处理传递完的数据。同时再发出读命令后,继续干其他的事情,不断重复。在此器件,CPU和I/O设备是并行工作的,相较于程序直接控制方式,节省了一些CPU的时间,效率明显提高,但是由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。
到这里,程序中断方式应该写完了的,但是提到了中断,所以我们这里借地方顺便学习一下程序中断的具体过程。
2.程序中断的工作过程
(1)中断请求
中断源是请求CPU中断的设备或事件,一台计算机允许有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。为记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器,当其状态为“1”时,表示中断源有请求。这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。
通过INTR线发出的是可屏蔽中断,通过NMI线发出的是不可屏蔽中断。可屏蔽中断的优先级最低,在关中断模式下不会被响应。不可屏蔽中断用于处理紧急和重要的事件,如时钟中断、电源掉电等,其优先级最高,其次是内部异常,即使在关中断模式下也会被响应。(这里涉及计算机组成原理中总线的知识,总线我也会写一篇专门的博客。)
(2)中断响应判优
中断响应优先级是指CPU响应中断请求的先后顺序。由于许多中断源提出中断请求的时间都是随机的,因此当多个中断源同时提出请求时,需通过中断判优逻辑来确定响应哪个中断源的请求,中断响应的判优通常是通过硬件排队器实现的。
一般来说, ①不可屏蔽中断>内部异常>可屏蔽中断;②内部异常中,硬件故障>软件中断;③DMA中断请求优先于I/O设备传送的中断请求;④在IO传送类中断请求中,高速设备优先于低速设备,输入设备优先于输出设备,实时设备优先于普通设备。
这里解释以下第三点,DMA中断请求优先于I/O设备传送的中断请求,这里I/O设备传送的中断请求就是指采用程序中断方式中发出的中断,而DMA中断请求是我们马上要学习的第三种I/O控制方式中产生的中断。
(3)CPU响应中断的条件
CPU在满足一定的条件下响应中断源发出的中断请求,并经过--些特定的操作,转去执行中断服务程序。CPU响应中断必须满足以下3个条件:
- ①中断源有中断请求。
- ②CPU允许中断及开中断(异常和不可屏蔽中断不受此限制)。
- ③一条指令执行完毕(异常不受此限制),且没有更紧迫的任务。
注意:IO设备的就绪时间是随机的,而CPU在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻。这里说的中断仅指I/O中断,内部异常不属于此类情况。(这一部分,如果你学习了指令系统这一块很好理解,其实中断有两种:程序执行过程中的中断可以理解为内中断,而I/O中断其实指的外中断,内中断也可以叫异常。
(4)中断响应过程
CPU响应中断后,经过某些操作,转去执行中断服务程序。这些操作是由硬件直接实现的,我们将它称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,只是一种虚拟的说法,本质上是硬件的- - .系列自动操作。它所完成的操作如下:
- ①关中断。CPU响应中断后,首先要保护程序的断点和现场信息,在保护断点和现场的过程中,CPU不能响应更高级中断源的中断请求。否则,若断点或现场保存不完整,在中断服务程序结束后,就不能正确地恢复并继续执行现行程序。
- ②保存断点。为保证在中断服务程序执行完后能正确地返回到原来的程序,必须将原程序的断点(指令无法直接读取的PC和PSW的内容)保存在栈或特定寄存器中。注意异常和中断的差异:异常指令通常并没有执行成功,异常处理后要重新执行,所以其断点是当前指令的地址。中断的断点则是下一条指令的地址。
- ③引出中断服务程序。识别中断源,将对应的(中断)服务程序入口地址送入程序计数器PC。有两种方法识别中断源:硬件向量法和软件查询法。本节主要讨论比较常用的向量中断。
(5)中断识别
异常和中断源的识别有软件识别和硬件识别两种方式。异常和中断源的识别方式不同,异常大多采用软件识别方式,而中断可以采用软件识别方式或硬件识别方式。
软件识别方式是指CPU设置一个异常状态寄存器,用于记录异常原因。操作系统使用一个统一的异常或中断查询程序,按优先级顺序查询异常状态寄存器,以检测异常和中断类型,先查询到的先被处理,然后转到内核中相应的处理程序。(意思就是先根据优先级判断中断,如果优先级一样,看出现的前后时间,选择要执行的中断对应的处理程序)
硬件识别方式又称向量中断,异常或中断处理程序的首地址称为中断向量,所有中断向量都存放在中断向量表中。每个异常或中断都被指定一个中断类型号。在中断向量表中,类型号和中断向量一一对应,因而可以根据类型号快速找到对应的处理程序。
(6)中断处理过程图
注意:现场和断点,这两类信息都不能被中断服务程序破坏。现场信息因为用指令可直接访问,所以通常在中断服务程序中通过指令把它们保存到栈中,即由软件实现;而断点信息由CPU在中断响应时自动保存到栈或指定的寄存器中,即由硬件实现。
中断屏蔽字:
中断处理过程中的屏蔽字,也称为中断屏蔽寄存器(Interrupt Mask Register,IMR),是用来控制哪些中断信号可以被 CPU 响应的二进制位序列。通过设置中断屏蔽字,可以禁止某些中断或者允许某些中断在特定条件下响应。
当 CPU 正在执行一个中断服务程序时,为了避免其他中断干扰当前程序的执行,可以使用中断屏蔽字来屏蔽其他中断信号的响应。同时,中断屏蔽字还可以根据需要动态地改变,以实现灵活的中断控制。
3.多重中断和中断屏蔽技术
若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断。若CPU暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套。
CPU要具备多重中断的功能,必须满足下列条件:①在中断服务程序中提前设置开中断指令。②优先级别高的中断源有权中断优先级别低的中断源。中断处理优先级是指多重中断的实际优先级处理次序,可以利用中断屏蔽技术动态调整,从而可以灵活地调整中断服务程序的优先级,使中断处理更加灵活。如果不使用中断屏蔽技术,则处理优先级和响应优先级相同。现代计算机一般使用中断屏蔽技术,每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。
四.DMA方式
1.DMA
在中断驱动方式中, I/O 设备与内存之间的数据交换必须要经过CPU中的寄存器,所以速度
还是受限,而DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据
交换通路,彻底“解放”CPU。DMA方式的特点如下:
- 1)基本单位是数据块。
- 2)所传送的数据,是从设备直接送入内存的,或者相反。
- 3)仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在DMA控制器的控制下完成的。
DMA方式是一种完全由硬件进行成组信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条“直接数据通道”,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。由于数据传送不经过CPU,也就不需要保护、恢复CPU现场等烦琐操作。
这种方式适用于磁盘、显卡、声卡、网卡等高速设备大批量数据的传送,它的硬件开销比较大。在DMA方式中,中断的作用仅限于故障和正常传送结束时的处理。
在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU 的主存控制信号被禁止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。由此可见,DMA控制器必须具有控制系统总线的能力。
2.DMA的传送方式
主存和IO设备之间交换信息时,不通过CPU,此时CPU不能控制主存。但当I/O设备和CPU同时访问主存时,可能发生冲突,为了有效地使用主存,DMA控制器与CPU通常采用以下3种方式使用主存:
- 1)停止CPU访存。当I/O设备有DMA请求时,由DMA控制器向CPU发送一个停止信号,使CPU脱离总线,停止访问主存,直到DMA传送一块数据结束。数据传送结束后,DMA控制器通知CPU可以使用主存,并把总线控制权交还给CPU。
- 2)周期挪用(或周期窃取)。当I/O设备有DMA请求时,会遇到3种情况:①是此时CPU不在访存(如CPU正在执行乘法指令),因此I/O的访存请求与CPU未发生冲突;②是CPU正在访存,此时必须待存取周期结束后,CPU再将总线占有权让出;③是I/O和CPU同时请求访存,出现访存冲突,此时CPU要暂时放弃总线占有权。I/O 访存优先级高于CPU访存,因为I/O不立即访存就可能丢失数据,此时由I/O设备挪用一个或几个存取周期,传送完一个数据后立即释放总线,是一种单字传送方式。
- 3)DMA与CPU交替访存。这种方式适用于CPU的工作周期比主存存取周期长的情况。例如,若CPU的工作周期是1.2us,主存的存取周期小于0.6us,则可将一个CPU周期分为C1和C2两个周期,其中C1专供DMA访存,C2专供CPU访存。这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时控制的。
3.DMA流程
DMA的数据传送过程分为预处理、数据传送和后处理3个阶段:
- 1)预处理。由CPU完成一些必要的准备工作。首先,CPU执行几条I/O指令,用以测试I/O设备状态,初始化DMA控制器中的有关寄存器、设置传送方向、启动该设备等。然后,CPU继续执行原来的程序,直到IO设备准备好发送的数据(输入情况)或接收的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(有时将这两个过程统称为DMA请求),用以传输数据。
- 2)数据传送。DMA的数据传输可以以单字节(或字)为基本单位,也可以以数据块为基本单位。对于以数据块为单位的传送( 如硬盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现的。需要指出的是,这一循环也是由 DMA控制器(而非通过CPU执行程序)实现的,即数据传送阶段完全由DMA (硬件)控制。
- 3)后处理。DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括校验送入主存的数据是否正确、测试传送过程中是否出错(错误则转诊断程序)及决定是否继续使用DMA传送其他数据等。
4.DMA与中断驱动方式的区别
- ①中断方式是程序的切换,需要保护和恢复现场:而DMA方式不中断现行程序,无需保护现场,除了预处理和后处理,其他时候不占用任何CPU资源。
- ②对中断请求的响应只能发生在每条指令执行结束时(执行周期后);而对DMA请求的响应可以发生在任意一个机器周期结束时(取指、间址、执行周期后均可)。
- ③中断传送过程需要CPU的干预:而DMA传送过程不需要CPU的干预,因此数据传输率非常高,适合于高速外设的成组数据传送。
- ④DMA请求的优先级高于中断请求。
- ⑤中断方式具有处理异常事件的能力,而DMA方式仅局限于大批数据的传送。
- ⑥从数据传送来看,中断方式靠程序传送,DMA方式靠硬件传送。
五.通道控制方式
I/O通道是指专门负责输入/输出的处理机。I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预。同时,又可以实现CPU、通道和IO设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O 通道发送一条I/O指令,以给出其所要执行的通道程序的首地址和要访问的I/O设备,通道接到该指令后,执行通道程序便可完成CPU指定的I/O任务,数据传送结束时向CPU发中断请求。I/O通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存。
I/O通道与DMA方式的区别是: DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个DMA控制器对应一台 设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。
它是一种硬件技术,把它理解为一个弱鸡版的CPU。
主机的内存中的,也就是说通道与CPU共享内存。
I/O通道与DMA方式的区别是: DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个DMA控制器对应一台 设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。
它是一种硬件技术,把它理解为一个弱鸡版的CPU。