8.4 输入/输出控制
8.4.1设备管理
设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。CPU通过I/O控制器和物理设备打交道。按照I/O控制器智能化程度的高低,可以把I/O设备的控制方式分为以下四类:循环测试I/O方式、I/O中断方式、DMA方式和通道方式。
(一)循环测试I/O方式
●由用户进程来直接控制内存或CPU和外设之间的信息传送;
●I/O控制器:OS软件和硬件设备之间接口,它接收CPU的命令,并控制I/O设备进行实际的操作;
●I/O控制器的组成:数据缓冲寄存器;控制寄存器(包含启动位、完成位、忙位等);
下面看一个循环测试I/O工作过程。假如一个程序要从某一输入设备输入一个数据,那么将按如下步骤进行:
①把一个启动位为“1”的控制字写入该设备的控制状态寄存器,从而启动该设备进行输入操作。
②反复读控制寄存器的内容,并测试其中的完成位,若为0,转②,否则转③。
③把数据缓冲区中的数据读入CPU或主存单元。
●优点:控制简单,无须太多硬件支持;
●缺点:CPU和外设串行工作,循环测试浪费CPU时间,CPU只能和一台外设交换数据,无法实现设备间的并行;
●适用范围:CPU速度慢,外围设备少的系统;
(二)I/O中断方式
为了提高CPU的利用率,应使CPU与I/O设备并行工作。为此出现了I/O中断方式。这种方式要求在控制状态寄存器中有一位“中断允许位”。
在I/O中断方式下,数据的输入按如下步骤进行:
①要求输入数据的进程把一个启动和中断允许位为“1”的控制字写入设备控制状态寄存器中,从而启动该设备进行物理操作。
②上述进程因等待输入操作的完成而进入等待状态。于是进程调度程序调另一进程运行。
③当输入完成时,输入设备通过中断申请线向CPU发中断请求信号,通过中断进入,CPU转向该设备的中断处理程序。
④中断处理程序首先保护被中断程序的现场,然后把输入缓冲寄存器中的输入数据转送到某一特定单元中去,以便要输入的进程使用。同时,还把等待输入完成的那个进程唤醒,最后中断处理程序恢复被中断程序的现场,并返回到被中断的进程继续执行。
⑤在以后某个时刻,进程调度程序将调度到要求输入的进程,该进程从约定的特定单元中取出做进一步处理。
●优点:CPU的利用率大大提高;外设与外设以及外设与CPU之间实现并行;
●缺点:中断次数太多,影响CPU的有效计算时间;
(三)通道方式
●通道:一个独立于CPU的专管输入/输出控制的处理机,它控制设备和内存直接进行数据交换,它有自己的通道指令,这些通道指令受CPU启动,并在操作结束时向CPU发中断信号;通道也被称为“I/O处理机”。
●通道的三种类型:字节多路通道;选择通道;数组多路通道;
●优点:有关I/O工作,CPU委托通道去做,使CPU基本摆脱了I/O控制工作,大大提高了CPU和外设的并行工作程度。
图8.7 通道的类型
(四)DMA方式
●在外设和主存之间开辟直接的数据交换通路;
●DMA控制器取代I/O控制器,控制外设和主存之间成批的进行数据交换,而不用CPU干预;
●DMA控制器中包含有:控制状态寄存器、数据缓冲寄存器、传送字节数寄存器、内存地址寄存器;
●CPU只在两处参与数据传输工作:
数据块传送开始时发启动命令;
整个数据块传输结束时发中断信号请求CPU进行中断处理;
DMA控制器与CPU、主存及I/O设备这间的关系如图8.8所示。
图8.8 DMA控制器与其他部件的关系
下面讨论在DMA方式下进行数据输入的步骤及过程:
①当一个进程准备要求设备输入一批数据时,把要求传送的主存始址和要传送的字节数分别送入DMA控制器的主存地址寄存器和传送字数寄存器。
②把允许中断位和启动位为“1”的一个控制字送入控制状态寄存器,从而启动设备进行成批的数据传送。
③上述进程把自己挂起,等待一批数据输入的完成,于是进程调度程序调度其他进程运行。
④当一批数据输入完成时,输入设备完成中断信号中断正在运行的进程,控制转向中断处理程序。
⑤中断处理程序首先保护被中断程序的现场,唤醒等待输入完成的进程,然后恢复现场,返回到被中断的进程。
⑥当进程调度程序调度到要求输入的进程时,该时程按照开始时指定的主存始址和实际传送字数对输入数据进行加工处理。
执行了上述步骤②之后,DMA硬件马上控制I/O设备与主存之间的信息交换。每当I/O设备把一个数据读入到DMA控制器的数据缓冲寄存器之后,DMA控制器立即取代CPU,接管地址总线的控制权,并按照DMA控制器中的主存地址寄存器内容把输入的数据送入相应在的主存单元。然后,DMA硬件电路自动地传送字数寄存器减1,把主存地址寄存器加1,并恢复CPU对主存的控制权,DMA控制器对每一个输入的数据重复上述过程,直到传送字数寄存器中的值变为时,向CPU发出完成中断信号。
8.4.2 输入/输出控制功能
I/O系统使进程能与外部设备(磁带、终端、打印机)及网络进行通信,而控制设备I/O工作的核心模块常称为设备驱动程序。
①解释用户的I/O系统调用命令。
②设备驱动。
③中断处理。
通常说的设备驱动包括驱动和中断处理两个方面。设备驱动程序与设备类型是一一对应的,即系统中的设备可以根据设备使用特性不同分为几大类,对于每一类设备可以包含有几个不同的单个的个体。例如打印机是一类设备,系统可以有多个打印机,-经们属于同类设备。正如8.1.2节中谈到的,设备处理具有一致性,即对于某一类设备,操作系统具有相同的设备驱动程序。例如,系统可以只含有一个磁盘驱程序以控制所有的磁盘,用一个终端驱协程序控制所有的终端。一个设备驱动程序可以控制一类给定类别的许多物理设备。而在驱动程序中,需要对它所控制的这些设备加以区分。也就是说,想送往某一终端的输出决不会送往另一个终端。
控制设备I/O的核心模块是如何工作的呢?可以有以下多种实现方式;
第一种方式:I/O控制模块有一个接口程序,它负责解释进程的I/O系统调用命令,即将其转换成I/O控制模块认识的命令形式。而对每类设备的处理则设置一个处理进程,其相应的程序就是该类设备和驱动程序。对于接口程序,如果通知它有I/O工作要做,则它就进行设备驱动工作;如果无工作可做,则它就处于等待状态,等有工作后被唤醒。在该类设备驱动程序中依具体的物理设备号再去启动物理的I/O操作。物理设备工作完成后会引起相应的中断处理。这类处理方式将在后面进一步介绍。
第二种方式:这是UNIX系统采用的方法。它将设备和文件一样看待。使用文件系统的系统调用命令进行设备的读、写操作等。设备作为特殊文件也有相应的文件目录表项(在UNIX系统中称为索引节点),根据文件类型(设备是特殊文件)可以查找该文件的索引节点,从而进入该类设备的驱动程序中。
8.4.3 输入/输出控制接口程序
一个典型的进程请求可通过下述通用形式的系统调用命令来实现:
doio(ldev,mode,amount,addr)
其中,ldev指出执行I/O的逻辑设备名;mode指出要求何种操作,例如是数据传输还是磁带反绕,必要时也可指出使用的哪一种字符码;amount指出传送数据的数目;addr对于数据输入而言,此项为传送的目的地(准备存放数据的主存地址);对数据输出而言,此项为传送的源(存放着准备输出的数据的主存地址)。
I/O控制接口程序,又称I/O过程(doio),它是可重入的,可被几个进程同时调用。它的功能是把逻辑设备映射为相应的物理设备,检查提供给它的参数的正确性,启动所需要的服务,现具体讨论如下:
1.实现使用设备的转换
根据进程I/O系统调用命令中给出的设备逻辑名,确定实际使用的物理设备。
当逻辑设备打开时,在相应的逻辑设备描述器记录了该逻辑设备与实际物理设备之间的随着系,并由进程控制块中ldd_ptr指针指示。当进入I/O过程时,与该逻辑设备联结的设备可由逻辑设备描述器中的信息来确定。
2.合法性检查
一旦设备被确定,就能够检查I/O请求的参数与保存在设备控制块(dcb)中的信息是否一致。如果检测出一个差错,就应产生一个出口,返回调用程序。可以进行一种具体检查是,该设备能束以所希望的方式进行操作。另外,也可以检查在给定的操作方式下数据传输的数量和目的地。在设备只能传送单个字符的情况下,给定数据传送的量必须是1,目的地或是寄存器,或是主存单元;对于直接传送数据块到主存的设备,给定的量必须等于块的大小(是固定还是可变尺寸应按设备而定),目的地是传输开始处的存储器地址。
3.形成I/O请求块,发消息给相应的设备处理进程
检查完成后,由I/O接口程序将请求的参数汇总到I/O请求块(iorb)中,并将它挂到当前请求使用该设备的iorb组成的队列中。I/O进程只要有I/O请求块它就处理传输工作,如果没有I/O请求它就等待(或称睡眠),直到有新的I/O请求来到时将它唤醒。当I/O接口程序将形成的I/O请求块加入I/O队列中,如果I/O进程因无I/O请求而等待则将它唤醒。
I/O控制接口程序(即I/O过程doio)的描述见MODULE8.1。
MODULE8.1 I/O过程
算法doio |
输入:设备的逻辑名 ldev |
操作类型 mode |
传送数据数目 amount |
传数数据地址 addr |
输出:如果传送出错,则还错误码返回,否则正确返回 |
{ |
While(该进程的逻辑设备描述器队列不空) |
{ |
If(理ldev相联结的物理设备找到) |
break; /*找到*/ |
} |
if(该进程的逻辑设备描述器队列为空) |
return(错误码);/*设备逻辑名错*/ |
检查参数与该设备特性是否一致; |
if(不一致) |
return(错误码);/*传送参数*/ |
构造iorb; |
把iorb插入到该设备的请求队列中; |
唤醒因等待I/O请求块而睡眠的进程; |
} |
8.4.4 设备处理进程
设备处理程序是能直接控制设备进行运转的程序。计算机的各种外部设备,总是以某种方式与CPU相联结的。它们的启动、工作和停止通常应受CPU控制或要求CPU给予服务。设备处理程序就是控制设备进行工作的程序。
设备处理进程执行一个连续不断的循环。其功能是从I/O请求队列中取出一个iorb,启动相应的I/O操作,然后进入等待状态,等待I/O完成。当设备的浣 成后进入中断处理程序,在那里会唤醒设备处理进程。它接着把数据传送到目的地。然后,删除此I/O请求块,唤醒请求I/O的进程。设备处理进程的描述见MODULE8.2。
MODULE8.2 设备处理进程
Prcess io |
{ |
1:while(设备请求队列不空) |
{ |
取一个iorb |
提取请求的详细信息; |
启动I/O操作; |
sleep(事件:I/O完成)/*I/O操作*/ |
/*等I/O完成后,进穰断处理程序,并在那里唤醒设备处理进程*/ |
if(出错) |
将错误信息写在该设备的dcb中; |
传送数据到目的地; |
唤醒请求此I/O操作的进程; |
删除iorb; |
} |
sleep(事件:因无I/O请求); |
goto1; |
} |
请求I/O的进程、I/O过程、相应设备的处理进程、中断处理程序之间的同步关系和控制流程汇总在图8.9中。这一过程也就是用户进程调用外部设备的过程。
图8.9 用户进程调用外部设备的过程
|