I/O设备及其分类
I/O设备管理是操作系统设计中最凌乱也最具挑战性的部分。
由于它包含了很多领域的不同设备以及与设备相关的应用程序,因此很难有一个通用且一致的设计方案。
所以在理解设备管理之前,应该先了解具体的I/O设备类型。
特性分类
计算机系统中的I/O设备按使用特性可分为以下类型:
1) 人机交互类外部设备:用于同计算机用户之间交互的设备,如打印机、显示器、鼠标、键盘等。这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换。
2) 存储设备:用于存储程序和数据的设备,如磁盘、磁带、光盘等。这类设备用于数据交换,速度较快,通常以多字节组成的块为单位进行数据交换。
3) 网络通信设备:用于与远程设备通信的设备,如各种网络接口、调制解调器等。其速度介于前两类设备之间。网络通信设备在使用和管理上与前两类设备也有很大不同。
除了上面最常见的分类方法,I/O设备还可以按以下方法分类:
1) 按传输速率分类:
低速设备:传输速率仅为每秒几个到数百个字节的一类设备,如键盘、鼠标等。 中速设备:传输速率在每秒数千个字节至数万个字节的一类设备,如行式打印机、 激光打印机等。 高速设备:传输速率在数百个千字节至千兆字节的一类设备,如磁带机、磁盘机、 光盘机等。
2) 按信息交换的单位分类:
块设备:由于信息的存取总是以数据块为单位,所以存储信息的设备称为块设备。它属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高,以及可寻址,即对它可随机地读/写任一块。
字符设备:用于数据输入/输出的设备为字符设备,因为其传输的基本单位是字符。它属于无结构类型,如交互式终端机、打印机等。它们的基本特征是传输速率低、不可寻址,并且在输入/输出时常釆用中断驱动方式。
I/O(输入/输出)控制方式
设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送,外围设备和内存之间的输入/输出控制方式有四种,下面分别介绍。
程序直接控制方式
如图5-1(a)所示,计算机从外部设备读取数据到存储器,每次读一个字的数据。
对读入的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器中。
在程序直接控制方式中,由于CPU的高速性和I/O设备的低速性,致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成了 CPU资源的极大浪费。
在该方式中,CPU之所以要不断地测试I/O设备的状态,就是因为在CPU中没有釆用中断机构,使I/O设备无法向CPU报告它已完成了一个字符的输入操作。
程序直接控制方式虽然简单易于实现,但是其缺点也是显而易见的,由于cpu和I/O设备只能串行工作,导致CPU的利用率相当低。
中断驱动方式
中断驱动方式的思想是,允许I/O设备主动打断CPU的运行并请求服务,从而“解放”CPU,使得其向I/O控制器发送读命令后可以继续做其他有用的工作。
如图5-1(b)所示,我们从I/O控制器和CPU两个角度分别来看中断驱动方式的工作过程:
从I/O控制器的角度来看,I/O控制器从CPU接收一个读命令,然后从外围设备读数据。一旦数据读入到该I/O控制器的数据寄存器,便通过控制线给CPU发出一个中断信号,表示数据已准备好,然后等待CPU请求该数据。I/O控制器收到CPU发出的取数据请求后,将数据放到数据总线上,传到CPU的寄存器中。至此,本次I/O操作完成,I/O控制器又可幵始下一次I/O操作。
- 图5-1 I/O控制方式
从CPU的角度来看,CPU发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器及处理机寄存器),转去执行其他程序。
在每个指令周期的末尾,CPU检查中断。当有来自I/O控制器的中断时,CPU保存当前正在运行程序的上下文,转去执行中断处理程序处理该中断。
这时,CPU从I/O控制器读一个字的数据传送到寄存器,并存入主存。
接着,CPU恢复发出I/O命令的程序(或其他程序)的上下文,然后继续运行。
中断驱动方式比程序直接控制方式有效,但由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。
DMA方式
在中断驱动方式中,I/O设备与内存之间的数据交换必须要经过CPU中的寄存器,所以速度还是受限,而DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放” CPU。DMA方式的特点是:
-
基本单位是数据块。
-
所传送的数据,是从设备直接送入内存的,或者相反。
-
仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在 DMA控制器的控制下完成的。
图5-2列出了 DMA控制器的组成。
- 图5-2 DMA控制器的组成
为了实现在主机与控制器之间成块数据的直接交换,必须在DMA控制器中设置如下四类寄存器:
-
命令/状态寄存器(CR):用于接收从CPU发来的I/O命令或有关控制信息,或设备的状态。
-
内存地址寄存器(MAR):在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
-
数据寄存器(DR):用于暂存从设备到内存,或从内存到设备的数据。
-
数据计数器(DC):存放本次CPU要读或写的字(节)数。
如图5-1(c)所示,DMA方式的工作过程是:CPU读写数据时,它给I/O控制器发出一条命令,启动DMA控制器,然后继续其他工作。
之后CPU就把控制操作委托给DMA控制器,由该控制器负责处理。DMA控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要CPU参与。当传送完成后,DMA控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要CPU的参与。
DMA控制方式与中断驱动方式的主要区别是中断驱动方式在每个数据需要传输时中断
CPU,而DMA控制方式则是在所要求传送的一批数据全部传送结束时才中断CPU;此外,中断驱动方式数据传送是在中断处理时由CPU控制完成的,而DMA控制方式则是在DMA 控制器的控制下完成的。
通道控制方式
I/O通道是指专门负责输入/输出的处理机。I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。同时,又可以实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O通道发送一条I/O指令,以给出其所要执行的通道程序的首地址和要访问的I/O设备,通道接到该指令后,通过执行通道程序便可完成CPU指定的I/O任务,数据传送结束时向CPU发中断请求。I/O通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行
的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存。
I/O通道与DMA方式的区别是:DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。
另外,每个DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。
I/O子系统的层次结构
I/O软件涉及的面非常广,往下与硬件有着密切的联系,往上又与用户直接交互,它与进程管理、存储器管理、文件管理等都存在着一定的联系,即它们都可能需要I/O软件来实现I/O操作。
为了使复杂的I/O软件具有清晰的结构,良好的可移植性和适应性,在I/O软件中普遍釆用了层次式结构,将系统输入/输出功能组织成一系列的层次,每一层都利用其下层提供的服务,完成输入/输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。
在层次式结构的I/O软件中,只要层次间的接口不变,对某一层次中的软件的修改都不会引起其下层或高层代码的变更,仅最底层才涉及硬件的具体特性。
- 图5-3 I/O层次结构
一个比较合理的层次划分如图5-3所示。
整个I/O系统可以看成具有四个层次的系统结构,各层次及其功能如下:
1) 用户层I/O软件
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。
一般而言,大部分的I/O软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。
用户层软件必须通过一组系统调用来获取操作系统服务。
2) 设备独立性软件
用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护、以友设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
设备独立性也称设备无关性,使得应用程序独立于具体使用的物理设备。为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。
在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。
使用逻辑设备名的好处是:
-
增加设备分配的灵活性;
-
易于实现I/O重定向,所谓I/O重定向,是指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。
总的来说,设备独立性软件的主要功能可分以为以下两个方面:
-
执行所有设备的公有操作。包括:对设备的分配与回收;将逻辑设备名映射为物理设备名;对设备进行保护,禁止用户直接访问设备;缓冲管理;差错控制;提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的差异。
-
向用户层(或文件层)提供统一接口。无论何种设备,它们向用户所提供的接口应该是相同的。例如,对各种设备的读/写操作,在应用程序中都统一使用read/write命令等。
3) 设备驱动程序:
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动 I/O设备工作的驱动程序。
通常,每一类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,常以进程形式存在。
设备驱动程序向上层用户程序提供一组标准接口,设备具体的差别被设备驱动程序所封装,用于接收上层软件发来的抽象I/O要求,如read和write命令,转换为具体要求后,发送给设备控制器,控制I/O设备工作;它也将由设备控制器发来的信号传送给上层软件。
从而为I/O内核子系统隐藏设备控制器之间的差异。
4)中断处理程序:
用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断进程。
中断处理层的主要任务有:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,故应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
5) 硬件设备:
I/O设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开:电子部件称为设备控制器(或适配器),在个人计算机中,通常是一块插入主板扩充槽的印刷电路板;机械部件则是设备本身。
设备控制器通过寄存器与CPU通信,在某些计算机上,这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则釆用I/O专用地址,寄存器独立编址。
操作系统通过向控制器寄存器写命令字来执行I/O功能。控制器收到一条命令后,CPU可以转向进行其他工作,而让设备控制器自行完成具体的I/O操作。
当命令执行完毕后,控制器发出一个中断信号,操作系统重新获得CPU的控制权并检查执行结果,此时,CPU仍旧是从控制器寄存器中读取信息来获得执行结果和设备的状态信息。
设备控制器的主要功能为:
-
接收和识别CPU或通道发来的命令,如磁盘控制器能接收读、写、查找等命令。
-
实现数据交换,包括设备和控制器之间的数据传输;通过数据总线或通道,控制器和主存之间的数据传输。
-
发现和记录设备及自身的状态信息,供CPU处理使用。
-
设备地址识别。
为实现上述功能,设备控制器(如图5-4)必须包含以下组成部分:
设备控制器与CPU的接口。该接口有三类信号线:数据线、地址线和控制线。数据线通常与两类寄存器相连接:数据寄存器(存放从设备送来的输入数据或从CPU送来的输出数据)和控制/状态寄存器(存放从CPU送来的控制信息或设备的状态信息)。
设备控制器与设备的接口。设备控制器连接设备需要相应数量的接口,一个接口连接一台设备。每个接口中都存在数据、控制和状态三种类型的信号。
I/O控制逻辑。用于实现对设备的控制。它通过一组控制线与CPU交互,对从CPU收到的I/O命令进行译码。CPU启动设备时,将启动命令发送给控制器,同时通过地:址线把地址发送给控制器,由控制器的I/O逻辑对地址进行译码,并相应地对所选设备进行控制。
- 图5-4 设备控制器的组成
I/O子系统概述和I/O调度的概念
I/O子系统概述
由于I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制。
这些方法共同组成了操作系统内核的I/O子系统,它将内核的其他方面从繁重的I/O设备管理中解放出来。
I/O核心子系统提供的服务主要有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等。
I/O调度概念
I/O调度就是确定一个好的顺序来执行这些I/O请求。
应用程序所发布的系统调用的顺序不一定总是最佳选择,所以需要I/o调度来改善系统整体性能,使进程之间公平地共享设备访问,减少I/O完成所需要的平均等待时间。
操作系统开发人员通过为每个设备维护一个请求队列来实现调度。当一个应用程序执行阻塞I/O系统调用时,该请求就加到相应设备的队列上。I/O调度会重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间。
I/O子系统还可以使用主存或磁盘上的存储空间的技术,如缓冲、高速缓冲、假脱机等,来改善计算机效率。
参考资料
https://lgwain.gitbooks.io/os/content/unit11.html