按设备的使用特性分类
按信息交换单位分类
按传输速率分类
按设备的共享属性分类
设备管理的主要任务是完成用户提出的 I/O 请求,为用户分配 I/O 设备,提高I/O设备的利用率,方便用户使用 I/O 设备。为了完成上述任务,设备管理应该具备以下功能。
设备分配
按照设备类型和相应的分配算法决定将 I/O 设备分配给哪一个进程。如果在 I/O 设备和CPU 之间还存在着设备控制器和通道,那么还必须分配相应的设备控制器和通道,以保证 I/O设备与 CPU之间有传递信息的通路。凡未分配到所需设备的进程应放在一个等待队列。为了实现设备分配,系统中应设置一些数据结构,用于记录设备的状态。
设备处理
设备处理程序用以实现 CPU 和设备控制器之间的通信。进行 I/O 操作时,由 CPU 向设备控制器发出I/O指令,启动设备进行 I/O 操作当I/O操作完成时能对设备发来的中断请求作出及时的响应和处理。
缓冲管理
设置缓冲区的目的是为了缓和 CPU与 I/O 设备速度不匹配的矛盾。缓冲管理序负责完成缓冲区的分配、释及有关的管理工作。
设备独立性
设备独立性又称为设备无关性,是指应用程序独立于物理设备。用户在编制应用程序时要尽量避免直接使用实际设备名。若程序中使用了实际设备名,则当该设备没有连续在系统中或者该设备发生故障时,用户程序无法运行,若要运行此程序,则需要修改程序。如果用户程序不涉及实际设备而使用逻辑设备,那么它所要求的输入/输出便与物理设备无关。设备独立性可以提高用户程序的可适应性。
设备一般由机械部分和电子部分组成,设备的电子部分通常称为设备控制器。设备控制器处于 CPU与 I/O 设备之间,其接收来自 CPU 的命令,并控制I/O 设备工作,使处理器从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址设备,当它仅控制一个设备时,它只有一个设备地址;当它可连接多个设备时,它应具有多个设备地址。
设备控制器应具备以下功能:
大多数设备控制器由设备控制器与处理器的接口、设备控制器与设备的接口及 I/O 逻辑3部分组成
I/O控制方式通常有以下4种:
在早期的计算机系统中没有中断系统,所以CPU和I/O设备进行通信、传输数据时,由于CPU 的速度远远快于I/O 设备,因此CPU 需要不断地测试 I/0 设备。这种控制方式又称为轮询或忙等。
以数据输入为例,当用户进程需要输入数据时,由处理器向设备控制器发出一条 I/O 指令启动设备进行输入。在设备输入数据期间,处理器通过循环执行测试指令不断地检测设备状态寄存器的值,当状态寄存器的值显示设备输入完成时,处理器将数据寄存器中的数据取出并送入内存指定单元,然后再启动设备去读下一个数据。反之,当用户进程需要向设备输出数据时,也必须同样发出启动命令启动设备输出并等待输出操作完成。
为了减少程序直接控制方式中的 CPU 等待时间,提高 CPU 与设备的并行工作程度,现代计算机系统中广泛采用中断控制方式对 IO设备进行控制。
以数据输入为例,当用户进程需要数据时,由 CPU 向设备控制器发出启动指令启动外设输入数据。在输入数据的同时,CPU 可以做其他工作。当输入完成时,设备控制器向 CPU发出一个中断信号,CPU 接收到中断信号之后,转去执行设备中断处理程序。设备中断处理程序将输入数据寄存器中的数据传送到某一特定内存单元中,供要求输入的进程使用,然后再启动设备去读下一个数据。
中断处理程序的处理过程(仅指I/O完成时发出的中断)如下:
DMA 控制方式的基本思想是在外设和内存之间开辟直接的数据交换通路。在 DMA控制方式中,设备控制器具有更强的功能,在其控制下,设备和内存之间可以成批地进行数据交换,而不用 CPU 干预。这样既大大减轻了 CPU 的负担也使 I/0 数据传输速度大大提高。这种方式一般用于块设备的数据传输。
仍然以数据输入为例,当用户进程需要数据时,CPU 将准备存放输入数据的内存起始地址以及要传送的字节数分别送入 DMA 控制器中的内存地址寄存器和传送字节计数器中,并启动设备开始进行数据输入。在输入数据的同时,CPU 可以去做其他事情。输入设备不断地挪用 CPU 工作周期,将数据寄存器中的数据源源不断地写入内存,直到要求传送的数据全部传输完毕。DMA 控制器在传输完毕时向 CPU 发送一个中断信号,CPU 收到中断信号后转中断处理程序执行,中断结束后返回被中断程序。
DMA 控制方式的特点为:数据传输的基本单位是数据块,数据是单向传输,且从设备直接送入内存或者相反;仅在传送一个或多个数据块的开始和结束时才需 CPU干预,整块数据的传送是在控制器的控制下完成的。
DMA 控制方式与中断控制方式的主要区别是中断控制方式在每个数据传送完成后中断CPU,而DMA 控制方式则是在所要求传送的一批数据全部传送结束时才中断CPU;中断控制方式的数据传送是在中断处理时由CPU 控制完成,而DMA 控制方式则是在DMA控制器的控制下完成。
DMA 控制器中主要包括4 类寄存器,用于主机和控制器之间成块数据的交换:
优点。DMA 控制方式下,设备和 CPU 可以并行工作,同时设备与内的数据交换速度加快,并且不需要 CPU 干预。
缺点。DMA 控制方式仍然存在一定局限性,如数据传送的方向、存放输入数据的内存起始地址及传送数据的长度等都由CPU 控制,并且每台设备都需要一个 DMA 控制器,当设备增加时,多个 DMA 控制器的使用也不经济。
通道控制方式与 DMA 控制方式类似,也是一种以内存为中心,实现设备与内存直接交换数据的控制方式。与DMA 控制方式相比,通道所需要的 CPU 干预更少,而且可以做到一个通道控制多台设备,从而进一步减轻了 CPU 负担。通道本质上是一个简单的处理器,它独立于 CPU,有运算和控制逻辑,有自己的指令系统,也在程序控制下工作,专门负责输入输出控制,具有执行I/O指令的能力,并通过执行通道I/O程序来控制 I/O操作。
与CPU 不同的是,通道的指令类型单一,这是由于通道硬件比较简单,其所能执行的命令主要局限于与 I/O操作有关的指令,且通道没有自己的内存,通道所执行的通道程序是放在主机的内存中的,换言之,是通道与 CPU共享内存。
字节多路通道
字节多路通道用于连接多个慢速和中速设备,这些设备的数据传送以字节为单位。每传送一个字节要等待较长时间,如终端设备等。因此,通道可以以字节交叉方式轮流为多个外设服务,以提高通道的利用率。这种通道的数据宽度一般为单字节。
数组选择通道
字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。这种通道虽然可以连接多台高速设备,但由于它只含有一个分配型子通道,在一段时间内只能执行一道通道程序,控制一台设备进行数据传送,致使当某台设备占用了该通道后,便一直由它独占,即使无数据传送,通道被闲置,也不允许其他设备使用该通道,直至该设备传送完毕释放该通道。可见,这种通道的利用率很低。
数组多路通道
数组选择通道虽有很高的传输速率,但它却每次只允许一个设备传输数据。数组多路通道是将数组选择通道传输速率高和多字节多路通道能使各子通道(设备)分时并行操作的优点相结合而形成的一种新通道。它含有多个非分配型子通道,因而这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。也正因此,才使该通道能广泛地用于连接多台高、中速的外围设备,其数据传送是按数组方式进行的。
I/O 通道方式是对 DMA 方式的发展,它进一步使 CPU 参与到数据传输的控制减少,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。同时,又可实现 CPU、通道和 I/O 设备的并行操作,从而更有效地提高了整个系统的资源利用率。
以数据输入为例,当用户进程需要数据时,CPU 发出启动指令指明要执行的 I/O操作、所使用的设备和通道。当对应通道接收到CPU 发来的启动指令后,把存放在内存中的通道程序读出,并执行通道程序,控制设备将数据传送到内存中指定的区域。在设备进行输入的同时,CPU 可以去做其他工作。当数据传送结束时,设备控制器向 CPU 发送一个中断请求CPU收到中断请求后转中断处理程序执行,中断结束后返回被中断程序。
通道控制方式与 DMA控制方式的区别:首先,DMA 控制方式中需要CPU 来控制所传输数据块的大小、传输的内存,而通道控制方式中这些信息都是由通道来控制管理的;其次,一个DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。
I/O 软件设计的基本思想是将设备管理软件组织成一种层次结构。其中低层软件与硬件相关,用来屏蔽硬件的具体细节;而高层软件则为用户提供一个友好的、清晰而统一的接口。I/O设备管理软件一般分为4层:中断处理程序、设备驱动程序、设备独立性软件和用户层软件。
当用户程序要从文件中读一个数据块时,需要通过操作系统来执行此操作。设备独立性软件首先在高速缓存中查找此数据块,若未找到,则调用设备驱动程序向硬件发出相应的请求,用户进程随即阻塞直到数据块被读出。当磁盘操作完成时,硬件产生一个中断,并转入中断处理程序。中断处理程序检查中断的原因,并从设备中获取所需的信息,然后唤醒睡眠的进程以结束此次 I/O 请求,使用户进程继续执行。
中断处理是控制输入/输出设备和内存与 CPU 之间的数据传送的主要方式。中断与硬件相关,I/O 设备的中断服务程序的代码与任何进程无关。当完成 I/O 操作时,设备便向 CPU发送一个中断信号,CPU 响应中断后便转入中断处理程序。
中断过程如下:
所有与设备相关的代码放在设备驱动程序中,由于设备驱动程序与设备密切相关,因此应为每一类设备配置一个驱动程序。
设备驱动程序的任务是接受来自上层的设备独立性软件的抽象请求,将这些请求转换成设备控制器可以接受的具体命令,再将这些命令发送给设备控制器,并监督这些命令正确执行。若请求到来时设备驱动程序是空闲的,则立即开始执行这个请求,若设备驱动程序正在执行一个请求,则将新到来的请求插入等待队列中。设备驱动程序是操作系统中唯一知道设备控制器中设置了多少个寄存器以及这些寄存器有何用途的程序。
设备驱动程序的处理过程:
虽然 I/O 软件中的一部分(如设备驱动程序)与设备相关,但大部分软件是与设备无关的。至于设备驱动程序与设备独立性软件之间的界限,则随操作系统的不同而不同,具体划分原则取决于系统的设计者怎样权衡系统与设备的独立性、设备驱动程序的运行效率等诸多因素。对于一些按照设备独立方式实现的功能,出于效率和其他方面的影响,也可以由设备驱动程序来实现。
设备独立性软件的基本任务是:实现一般设备都需要的 I/O 功能,并向用户空间软件提供一个统一的接口。设备独立性软件通常应实现的功能包括设备驱动程序的统一接口,设备命名,设备保护,提供与设备无关的逻辑块,缓冲、存储设备的块分配,独占设备的分配和释放,出错处理。
一般来说,大部分 I/O 软件都包含在操作系统中,但仍有一部分是由与用户程序链接在一起的库函数,甚至运行于内核之外的程序构成的。通常的系统调用包括 I/O 系统调用,是由库函数实现的。SPOOLing系统也处于这一层。
I/O 核心子系统是设备控制的各类方法,其提供的服务主要有 I/O 调度、高速缓存与缓冲设备分配与回收、假脱机技术等。
I/O 调度就是确定一个好的顺序执行 I/O 请求。应用程序所发布系统调用的顺序不一定总是最佳选择,所以需要通过 I/O 调度来改善系统的整体性能,使进程间公平地共享设备访问,减少I/O 完成所需要的平均等待时间。
操作系统通过为每个设备维护一个请求队列来实现调度。当一个应用程序执行阻塞 I/O系统调用时,该请求就被加到相应设备的队列上。I/O 调度重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间。
I/O子系统改善计算机效率的方法包括 I/O 调度和使用主存或磁盘上的存储空间技术,如缓冲、高速缓存和假脱机等。
提高处理器与外设并行程度的另一项技术就是缓冲技术。
虽然中断、DMA 和通道控制技术使得系统中设备和设备、设备和CPU 得以并行运行,但是设备和CPU处理速度不匹配的问题是客观存在的,这个问题制约了计算机系统性能的进一步提高。
缓冲区的引入缓和了CPU与设备速度不匹配的矛盾,提高了设备和CPU 的并行操作程度,提高了系统吞吐量和设备利用率。此外,引入缓冲后可以降低设备对 CPU 的中断频率,放宽对中断响应时间的限制。
缓存的实现方法有两种:
根据系统设置的缓冲区个数,缓冲技术可以分为单缓冲、双缓冲、循环缓冲和缓冲池。
单缓冲
单缓冲是操作系统提供的一种最简单的缓冲形式。当用户进程发出一个 I/O 请求时,操作系统便在内存中为它分配一个缓冲区。由于只设置了一个缓冲区,设备和处理器交换数据时,应先把要交换的数据写入缓冲区,然后由需要数据的设备或处理器从缓冲区取走数据,因此设备与处理器对缓冲区的操作是串行的。
双缓冲
引入双缓冲可以提高处理与备的并行操作程度。在块设备输入时,输入设备先将第一个缓冲区装满数据,在输入设备装填第二个缓冲区的同时,操作系统可以将第一个缓冲区的数据传送到用户区供处理器进行计算;当第一个缓冲区中的数据处理完后若第二个缓冲区已经装满,则处理器又可以处理第二个缓冲区的数据,而输入设备又可以装填第一个缓冲区。显然,双缓冲的使用提高了处理器和输入设备并行操作的程度。只有当两个缓冲区都为空,进程还要提取数据时,该进程阻塞。
循环缓冲
双缓冲方案在设备输入/输出速度与处理器处理数据速度基本匹配时能获得较好的效果,但若两者速度相差甚远,双缓冲的效果则不够理想。为此引入了循环缓冲技术。
循环缓冲包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区的指针指向第一个缓冲区,这样多个缓冲区构成一个环形。循环缓冲用于输入/输出时,还需要有两个指针 im 和 out。对于输入而言,首先要从设备接收数据到缓冲区中,in 指针指向可以输入数据的第一个空缓冲区;当用户进程需要数据时,从循环缓冲中取出一个装满数据的缓冲区,提取数据,out 指针指向可以提取数据的第一个满缓冲区。显然,对输出而言正好相反,进程将处理过的需要输出的数据送到空缓冲区中,而当设备空闲时,从满缓冲区中取出数据由设备输出。
缓冲池
循环缓冲一般适用于特定的 I/0进程和计算进程,因而当系统中进程很多时将会有许多这样的缓冲,这不仅要消耗大量的内存空间,而且利用率不高。目前,计算机系统中广泛使用缓冲池,缓冲池由多个缓冲区组成,其中的缓冲区可供多个进程共享,并且既能用于输入,又能用于输出。
缓冲池中的缓冲区按其使用状况可以形成以下 3 个队列:
4 种工作缓冲区:
当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把其作为收容输入数据的工作缓冲区,然后把数据输入其中,装满后再将它挂到输入队列队尾。当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入数据的工作缓冲区,计算进程从中提取数据,数据用完后再将其挂到空缓冲队列队尾。当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出数据的工作缓冲区,当其中装满输出数据后,再将其挂到输出队列队尾。当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出数据的工作缓冲区,当数据提取完后,再将其挂到空缓冲队列的末尾。
高速缓存是可以保存数据备份的高速存储器。访问高速缓存要比访问原始数据更高效,速度更快。虽然高速缓存和缓冲区均介于一个高速设备和一个低速设备之间,但高速缓存并不等价于缓冲区,它们之间有着很大的区别。
两者存放的数据不同。高速缓存上放的是低速设备上的某些数据的一个备份,也就是说,高速缓存上有的数据,低速设备上必然有;而缓冲区中放的则是低速设备传递给高速设备的数据,这些数据从低速设备传递到缓冲区中,然后再从缓冲区送到高速设备,而在低速设备中却不一定有备份。
两者的目的不同。引入高速缓存是为了存放低速设备上经常要被访问到的数据的备份,这样一来,高速设备就不需要每次都访问低速设备,但是如果要访问的数据不在高速缓存中,那么高速设备还是需要访问低速设备;而缓冲区是为了缓和高速设备和低速设备间速度不匹配的矛盾,高速设备和低速设备间每次的通信都要经过缓冲区,高速设备不会直接去访问低速设备。
设备分配是设备管理的功能之一,当进程向系统提出 I/O 请求之后,设备分配程序将按照一定的分配策略为其分配所需设备,同时还要分配相应的设备控制器和通道,以保证 CPU和设备之间的通信。
为了实现对 I/O 设备的管理和控制,需要对每台设备、通道、设备控制器的有关情况进行记录。设备分配依据的主要数据结构有设备控制表(DCT)、设备控制器控制表(COCT)、通道控制表(CHCT)和系统设备表 (SDT)。不仅设备要控制表,控制器也要控制表,而且控制控制器的通道也要控制表,同时,作为最终资源的设备也要有个表,就是系统设备表。
在计算机系统中,请求设备为其服务的进程数往往多于设备数,这样就出现了多个进程对某类设备的竞争问题。为了保证系统有条不地工作,系统在进行设备分配时应考虑以下问题。
设备的使用性质
设备分配算法
设备分配的安全性
所谓设备分配的安全性,是指在设备分配中应保证不发生进程的死锁。
在进行设备分配时,可采用静态分配方式和动态分配方式。静态分配是指在用户作业开始执行之前,由系统一次性分配该作业所需要的所有设备、设备控制器和通道,一旦分配,则一直占用,直至作业撤销。静态分配虽然不会出现死锁,但设备使用效率较低。动态分配是指在进程执行过程中根据执行需要进行设备分配。在进程需要设备时申请,用完后立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法不当,则可能造成死锁。
设备的动态分配方式分为安全分配和不安全分配。
设备独立性是指应用程序独立于具体使用的物理设备,它可以提高设备分配的灵活性和设备的利用率。为了提高操作系统的可适应性和可扩展性,现代操作系统无例外地实现了设备独立性(又称设备无关性)。
为了实现设备独立性,引入了逻辑设备和物理设备这两个概念,而系统中需要设置一张逻辑设备表(LUT),其中每个表项中都有逻辑设备名、物理设备名和设备驱动程序入口地址。在应用程序中,使用逻辑设备名来请求使用某类设备,而系统为这个进程分配的逻辑设备对应一个物理设备和设备驱动程序入口地址,这些信息都被放在逻辑设备表的一项中,以后该进程通过逻辑设备名来请求I/O 操作时,就可以找到对应的物理设备和驱动程序入口地址。
设备独立性带来的好处有:设备分配时的灵活性和易于实现 I/O重定向。
为了实现设备独立性,必须在设备驱动程序之上设置一层设备独立性软件,用来执行所有 I/O 设备的公用操作,并向用户层软件提供统一接口。关键是系统中必须设置一张逻辑设备表用来进行逻辑设备到物理设备的映射,其中每个表目中包含了逻辑设备名、物理设备名和设备驱动程序入口地址 3 项;当应用程序用逻辑设备名请求I/O设备时,系统必须为它分配相应的物理设备,并在 LUT 中建立一个表目,以后进程利用该逻设备名请求 I/O 操作时,便可从LUT中得到物理设备名和驱动程序入口地址。
操作系统实现设备独立性的方法包括设置设备独立性软件、配置逻辑设备表以及实现逻辑设备到物理设备的映射。
单通路I/O系统的设备分配
当某一进程提出 I/O 请求后,系统的设备分配程序可以按照下述步骤进行设备分配:
在分配时,若遇到对应设备忙的情况,则将进程插入到对应的等待队列中。
多通路I/O系统的设备分配
为了提高系统灵活性,通常采用多通路 I/O 系统结构,即一个设备与多个设备控制器相连,设备控制器也与多个通道相连。当进程提出 I/O 请求时,系统可选择将该类设备中的任何一台设备分配给该进程,步骤如下:
当进程使用完对应的 I/O 设备后,释放所占有设备、设备控制器及通道,系统进行回收,修改对应的数据结构,以便下次分配时使用。
系统中独占设备的数量有限,往往不能满足系统中多个进程的需要,从而成为系统的“瓶颈”,使许多进程因等待而阻塞。另外,分配到独占设备的进程,在整个运行期间往往占有但不经常使用设备,使设备利用率偏低。为克服这种缺点,人们通过共享设备来虚拟独占设备,将独占设备改造成共享设备,从而提高了设备利用率和系统的效率,该技术称为假脱机(SPOOLing)技术。
SPOOLing 的意思是同时外设联机操作(Simultaneous Peripheral Operating On-Line),又称为假脱机输入/输出操作。SPOOLing 技术实际上是一种外设同时联机操作技术,也称为排队转储技术。SPOOLing 系统不同于脱机方式。
SPOOLing 技术是低速输入/输出设备与主机交换的一种技术,其核心思想是以联机的方式得到脱机的效果。低速设备经通道和设在主机内存的缓冲存储器与高速设备相连,该高速设备通常是辅存。为了存放从低速设备上输入的信息,在内存中形成缓冲区,在高速设备上形成输出井和输入井,传递时信息从低速设备传入缓冲区,再传到高速设备的输入井,再从高速设备的输出井传到缓冲区,最后传到低速设备。
输入井和输出井。输入井和输出井是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出并模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
输入冲区和输出缓冲区。输入缓冲区和输出缓冲区是在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备传递过来的数据,然后再传送到输入井。输出缓冲区用于暂存从输出井传递过来的数据,然后再传送到输出设备。
输入进程和输出进程。输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入设备通过输入缓冲区再传递到输入井。当需要输入数据时,CPU 直接将数据从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井等输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。
将一台独享打印机改造为可供多个用户共享的打印机,是应用 SPOOLing 技术的典型实例。具体做法是:系统对于用户的打印输出,并不真正把打印机分配给该用户进程,而是先在输出井中申请一个空闲盘块区,并将要打印的数据送入其中;然后为用户申请并填写请求打印表,将该表挂到请求打印队列上。若打印机空闲,输出程序从请求打印队首取表,将要打印的数据从输出井传送到内存缓冲区,再进行打印,直到打印队列为空。