操作系统笔记——设备管理

5. 设备管理

5.1 I/O管理概述

5.1.1 I/O设备的分类与I/O管理的任务

I/O设备的分类

  • 按设备的使用特性分类

    • 存储设备。它是计算机用来保存各种信息的设备,如磁盘、磁带等。
    • 人机交互设备。它是计算机与计算机用户之间交互的设备,用于向 CPU 传输信息或输出经过 CPU 加工处理的信息,如键盘是输入设备,显示器和打印机是输出设备。
    • 网络通信设备。用于与远程设备通信的设备,如各种网络接口、调制解调器等
  • 按信息交换单位分类

    • 字符设备。处理信息的基本单位是字符,如键盘、打印机和显示器是字符设备。
    • 块设备。处理信息的基本单位是字符块。一般字符块的大小为512B~4KB,如磁盘是块设备。
  • 按传输速率分类

    • 低速设备。它是指其传输速率仅为每秒几个字节至数百个字节的一类设备,如键盘鼠标等。
    • 中速设备。它是指其传输速率在每秒数千字节至数万字节的一类设备,如行式打印机、激光打印机等。
    • 高速设备。它是指其传输率在秒数十万个字节至十兆字节的一类设备,如磁带机、磁盘等。
  • 按设备的共享属性分类

    • 独占设备。它是指在同一时刻只有一个进程可以使用的设备,属于临界资源。一旦系统将这类设备分配给某个进程后,便由该进程独占,直至用完释放。多数低速设备都属于独占设备,如打印机。
    • 共享设备。它是指允许多个进程访问的设备,如磁盘就是非常典型的共享设备,它允许若干个进程交替地读写信息,当然在一个时刻,一台设备只允许一个进程访问。
    • 虚拟设备。它是指通过虚拟技术让一个独占设备在逻辑上被多个进程同时使用的设备,如采用虚拟技术后的打印机,进程可以同时发送打印信息给打印机,就像有多个打印机一样。

I/O管理的任务和功能

设备管理的主要任务是完成用户提出的 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 设备速度不匹配的矛盾。缓冲管理序负责完成缓冲区的分配、释及有关的管理工作。

  • 设备独立性

    设备独立性又称为设备无关性,是指应用程序独立于物理设备。用户在编制应用程序时要尽量避免直接使用实际设备名。若程序中使用了实际设备名,则当该设备没有连续在系统中或者该设备发生故障时,用户程序无法运行,若要运行此程序,则需要修改程序。如果用户程序不涉及实际设备而使用逻辑设备,那么它所要求的输入/输出便与物理设备无关。设备独立性可以提高用户程序的可适应性

5.1.2 I/O控制方式

设备一般由机械部分和电子部分组成,设备的电子部分通常称为设备控制器。设备控制器处于 CPU与 I/O 设备之间,其接收来自 CPU 的命令,并控制I/O 设备工作,使处理器从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址设备,当它仅控制一个设备时,它只有一个设备地址;当它可连接多个设备时,它应具有多个设备地址。

设备控制器应具备以下功能

  • 接收和识别来自 CPU 的各种指令
  • 实现 CPU 与设备控制器、设备控制器与设备之间的数据交换
  • 记录设备的状态供 CPU 查询
  • 识别所控制的每个设备的地址
  • 对CPU输出的数据或设备向CPU 输入的数据进行缓冲
  • 对输入/输出数据进行差错控制

大多数设备控制器由设备控制器与处理器的接口、设备控制器与设备的接口及 I/O 逻辑3部分组成

在这里插入图片描述

I/O控制方式通常有以下4种

程序直接控制方式

在早期的计算机系统中没有中断系统,所以CPU和I/O设备进行通信、传输数据时,由于CPU 的速度远远快于I/O 设备,因此CPU 需要不断地测试 I/0 设备。这种控制方式又称为轮询或忙等。

在这里插入图片描述

以数据输入为例,当用户进程需要输入数据时,由处理器向设备控制器发出一条 I/O 指令启动设备进行输入。在设备输入数据期间,处理器通过循环执行测试指令不断地检测设备状态寄存器的值,当状态寄存器的值显示设备输入完成时,处理器将数据寄存器中的数据取出并送入内存指定单元,然后再启动设备去读下一个数据。反之,当用户进程需要向设备输出数据时,也必须同样发出启动命令启动设备输出并等待输出操作完成。

  • 优点。程序直接控制方式的工作过程非常简单。
  • 缺点。CPU 的利用率相当低。因为 I/O 设备的速度太慢,跟不上 CPU,致使 CPU的绝大部分时间都在测试I/O设备是否已经完成数据传输,从而造成CPU的极大浪费

中断控制方式

为了减少程序直接控制方式中的 CPU 等待时间,提高 CPU 与设备的并行工作程度,现代计算机系统中广泛采用中断控制方式对 IO设备进行控制。

在这里插入图片描述

以数据输入为例,当用户进程需要数据时,由 CPU 向设备控制器发出启动指令启动外设输入数据。在输入数据的同时,CPU 可以做其他工作。当输入完成时,设备控制器向 CPU发出一个中断信号,CPU 接收到中断信号之后,转去执行设备中断处理程序。设备中断处理程序将输入数据寄存器中的数据传送到某一特定内存单元中,供要求输入的进程使用,然后再启动设备去读下一个数据。

  • 优点。与程序直接控制方式相比,有了中断的硬件支持后,CPU 和I/O 设备间可以并行工作了,CPU只需收到中断信号后处理即可,大大提高了 CPU 利用率
  • 缺点。这种控制方式仍然存在一些问题,如每台设备每输入/输出一个数据,都要求中断CPU,这样在一次数据传送过程中的中断次数过多,从而耗费了大量CPU 时间。

中断处理程序的处理过程(仅指I/O完成时发出的中断)如下

  • 唤醒被阻塞的驱动(程序)进程:可能用signal操作或发送信号来唤醒被阻塞的驱动(程序)进程。
  • 保护被中断进程的CPU环境:将处理器状态字PSW和程序计数PC压入中加以保存,其他需要被压入栈中保护的还有 CPU的寄存器等,这些都是由硬件完成的。
  • 转入想要的设备处理程序:测试中断源以确定引起中断的设备号。
  • 中断处理:针对该设备调用相应的中断处理程序。
  • 恢复被中断进程的现场:把当时压入保护的存器等数据弹出,恢复当时的 CPU执行的上下文。

DMA控制方式

DMA 控制方式的基本思想是在外设和内存之间开辟直接的数据交换通路。在 DMA控制方式中,设备控制器具有更强的功能,在其控制下,设备和内存之间可以成批地进行数据交换,而不用 CPU 干预。这样既大大减轻了 CPU 的负担也使 I/0 数据传输速度大大提高。这种方式一般用于块设备的数据传输。

在这里插入图片描述

仍然以数据输入为例,当用户进程需要数据时,CPU 将准备存放输入数据的内存起始地址以及要传送的字节数分别送入 DMA 控制器中的内存地址寄存器和传送字节计数器中,并启动设备开始进行数据输入。在输入数据的同时,CPU 可以去做其他事情。输入设备不断地挪用 CPU 工作周期,将数据寄存器中的数据源源不断地写入内存,直到要求传送的数据全部传输完毕。DMA 控制器在传输完毕时向 CPU 发送一个中断信号,CPU 收到中断信号后转中断处理程序执行,中断结束后返回被中断程序

DMA 控制方式的特点为:数据传输的基本单位是数据块,数据是单向传输,且从设备直接送入内存或者相反;仅在传送一个或多个数据块的开始和结束时才需 CPU干预,整块数据的传送是在控制器的控制下完成的

DMA 控制方式与中断控制方式的主要区别中断控制方式在每个数据传送完成后中断CPU,而DMA 控制方式则是在所要求传送的一批数据全部传送结束时才中断CPU;中断控制方式的数据传送是在中断处理时由CPU 控制完成,而DMA 控制方式则是在DMA控制器的控制下完成

DMA 控制器中主要包括4 类寄存器,用于主机和控制器之间成块数据的交换

  • 命令/状态寄存器 (CR):用于接收从 CPU 发的 I/O命令或有关控制信息,或设备的状态。
  • 内存地址存器(MAR):用于从传送到内或从内存到备的内存地址。
  • 数据存器(DR)用于存从设备到内存或从内存到设备的数据
  • 数据计数器(DC):存放本次要传送的字数。

优点。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收到中断请求后转中断处理程序执行,中断结束后返回被中断程序。

  • 优点。通道控制方式解决了 I/O 操作的独立性和各部件工作的并行性。通道把中央处理器从烦琐的输入/输出操作中解放出来。采用通道技术后,不仅能实现 CPU 和通道的并行操作,而且也能实现通道与通道之间的并行操作,各通道上的外设也能实现并行操作,从而可达到提高整个系统效率的根本目的。
  • 由于需要更多硬件(通道处理器),因此其成本较高。通道控制方式通常应用于大型数据交互的场合。

通道控制方式与 DMA控制方式的区别:首先,DMA 控制方式中需要CPU 来控制所传输数据块的大小、传输的内存,而通道控制方式中这些信息都是由通道来控制管理的;其次,一个DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换

5.1.3 I/O软件层次结构

I/O 软件设计的基本思想是将设备管理软件组织成一种层次结构。其中低层软件与硬件相关,用来屏蔽硬件的具体细节;而高层软件则为用户提供一个友好的、清晰而统一的接口I/O设备管理软件一般分为4层:中断处理程序、设备驱动程序、设备独立性软件和用户层软件

层次结构概述

在这里插入图片描述

当用户程序要从文件中读一个数据块时,需要通过操作系统来执行此操作。设备独立性软件首先在高速缓存中查找此数据块,若未找到,则调用设备驱动程序向硬件发出相应的请求,用户进程随即阻塞直到数据块被读出。当磁盘操作完成时,硬件产生一个中断,并转入中断处理程序。中断处理程序检查中断的原因,并从设备中获取所需的信息,然后唤醒睡眠的进程以结束此次 I/O 请求,使用户进程继续执行。

中断处理程序

中断处理是控制输入/输出设备和内存与 CPU 之间的数据传送的主要方式。中断与硬件相关,I/O 设备的中断服务程序的代码与任何进程无关。当完成 I/O 操作时,设备便向 CPU发送一个中断信号,CPU 响应中断后便转入中断处理程序。

中断过程如下:

  • 唤醒被阻塞的驱动程序进程
  • 保护被中断进程的 CPU 环境
  • 分析中断原因
  • 进行中断处理
  • 恢复被中断进程的现场

设备驱动程序

所有与设备相关的代码放在设备驱动程序中,由于设备驱动程序与设备密切相关,因此应为每一类设备配置一个驱动程序。

设备驱动程序的任务是接受来自上层的设备独立性软件的抽象请求,将这些请求转换成设备控制器可以接受的具体命令,再将这些命令发送给设备控制器,并监督这些命令正确执行若请求到来时设备驱动程序是空闲的,则立即开始执行这个请求,若设备驱动程序正在执行一个请求,则将新到来的请求插入等待队列中设备驱动程序是操作系统中唯一知道设备控制器中设置了多少个寄存器以及这些寄存器有何用途的程序

设备驱动程序的处理过程:

  • 将抽象要求转换为具体要求
  • 检查 I/O 请求的合法性
  • 读出和检查设备的状态
  • 传送必要参数
  • 设置工作方式
  • 启动I/O设备

设备独立性软件

虽然 I/O 软件中的一部分(如设备驱动程序)与设备相关,但大部分软件是与设备无关的。至于设备驱动程序与设备独立性软件之间的界限,则随操作系统的不同而不同,具体划分原则取决于系统的设计者怎样权衡系统与设备的独立性、设备驱动程序的运行效率等诸多因素。对于一些按照设备独立方式实现的功能,出于效率和其他方面的影响,也可以由设备驱动程序来实现。

设备独立性软件的基本任务是:实现一般设备都需要的 I/O 功能,并向用户空间软件提供一个统一的接口。设备独立性软件通常应实现的功能包括设备驱动程序的统一接口,设备命名,设备保护,提供与设备无关的逻辑块,缓冲、存储设备的块分配,独占设备的分配和释放,出错处理。

用户层软件

一般来说,大部分 I/O 软件都包含在操作系统中,但仍有一部分是由与用户程序链接在一起的库函数,甚至运行于内核之外的程序构成的。通常的系统调用包括 I/O 系统调用,是由库函数实现的。SPOOLing系统也处于这一层。

5.2 I/O核心子系统

I/O 核心子系统是设备控制的各类方法,其提供的服务主要有 I/O 调度、高速缓存与缓冲设备分配与回收、假脱机技术等。

5.2.1 I/O调度概念

I/O 调度就是确定一个好的顺序执行 I/O 请求应用程序所发布系统调用的顺序不一定总是最佳选择,所以需要通过 I/O 调度来改善系统的整体性能,使进程间公平地共享设备访问,减少I/O 完成所需要的平均等待时间

操作系统通过为每个设备维护一个请求队列来实现调度。当一个应用程序执行阻塞 I/O系统调用时,该请求就被加到相应设备的队列上。I/O 调度重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间。

I/O子系统改善计算机效率的方法包括 I/O 调度和使用主存或磁盘上的存储空间技术,如缓冲、高速缓存和假脱机等。

5.2.2 高速缓存与缓冲区

提高处理器与外设并行程度的另一项技术就是缓冲技术。

缓存的引入

虽然中断、DMA 和通道控制技术使得系统中设备和设备、设备和CPU 得以并行运行,但是设备和CPU处理速度不匹配的问题是客观存在的,这个问题制约了计算机系统性能的进一步提高。

缓冲区的引入缓和了CPU与设备速度不匹配的矛盾,提高了设备和CPU 的并行操作程度,提高了系统吞吐量和设备利用率。此外,引入缓冲后可以降低设备对 CPU 的中断频率,放宽对中断响应时间的限制

缓存的实现方法有两种:

  • 采用硬件缓冲器来实现,但由于其成本太高,除一些关键部位外,一般情况下不采用。
  • 在内存中划出一块存储区,专门用来临时存放输入输出数据,这个区域称为缓冲区。

缓存的分类

根据系统设置的缓冲区个数,缓冲技术可以分为单缓冲、双缓冲、循环缓冲和缓冲池

  • 单缓冲

    在这里插入图片描述

    单缓冲是操作系统提供的一种最简单的缓冲形式。当用户进程发出一个 I/O 请求时,操作系统便在内存中为它分配一个缓冲区。由于只设置了一个缓冲区,设备和处理器交换数据时,应先把要交换的数据写入缓冲区,然后由需要数据的设备或处理器从缓冲区取走数据,因此设备与处理器对缓冲区的操作是串行的

  • 双缓冲

    在这里插入图片描述

    引入双缓冲可以提高处理与备的并行操作程度。在块设备输入时,输入设备先将第一个缓冲区装满数据,在输入设备装填第二个缓冲区的同时,操作系统可以将第一个缓冲区的数据传送到用户区供处理器进行计算;当第一个缓冲区中的数据处理完后若第二个缓冲区已经装满,则处理器又可以处理第二个缓冲区的数据,而输入设备又可以装填第一个缓冲区。显然,双缓冲的使用提高了处理器和输入设备并行操作的程度。只有当两个缓冲区都为空,进程还要提取数据时,该进程阻塞。

  • 循环缓冲

    双缓冲方案在设备输入/输出速度与处理器处理数据速度基本匹配时能获得较好的效果,但若两者速度相差甚远,双缓冲的效果则不够理想。为此引入了循环缓冲技术。

    在这里插入图片描述

    循环缓冲包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区的指针指向第一个缓冲区,这样多个缓冲区构成一个环形。循环缓冲用于输入/输出时,还需要有两个指针 im 和 out。对于输入而言,首先要从设备接收数据到缓冲区中,in 指针指向可以输入数据的第一个空缓冲区;当用户进程需要数据时,从循环缓冲中取出一个装满数据的缓冲区,提取数据,out 指针指向可以提取数据的第一个满缓冲区。显然,对输出而言正好相反,进程将处理过的需要输出的数据送到空缓冲区中,而当设备空闲时,从满缓冲区中取出数据由设备输出。

  • 缓冲池

    循环缓冲一般适用于特定的 I/0进程和计算进程,因而当系统中进程很多时将会有许多这样的缓冲,这不仅要消耗大量的内存空间,而且利用率不高。目前,计算机系统中广泛使用缓冲池,缓冲池由多个缓冲区组成,其中的缓冲区可供多个进程共享,并且既能用于输入,又能用于输出。

    在这里插入图片描述

    缓冲池中的缓冲区按其使用状况可以形成以下 3 个队列:

    • 空缓冲队列
    • 装满输入数据的缓冲队列(输入队列)
    • 装满输出数据的缓冲队列(输出队列)

    4 种工作缓冲区:

    • 用于收容输入数据的工作缓冲区
    • 用于提取输入数据的工作缓冲区
    • 用于收容输出数据的工作缓冲区
    • 用于提取输出数据的工作缓冲区

    当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把其作为收容输入数据的工作缓冲区,然后把数据输入其中,装满后再将它挂到输入队列队尾。当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入数据的工作缓冲区,计算进程从中提取数据,数据用完后再将其挂到空缓冲队列队尾。当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出数据的工作缓冲区,当其中装满输出数据后,再将其挂到输出队列队尾。当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出数据的工作缓冲区,当数据提取完后,再将其挂到空缓冲队列的末尾。

    高速缓存与缓冲区

    高速缓存是可以保存数据备份的高速存储器访问高速缓存要比访问原始数据更高效,速度更快。虽然高速缓存和缓冲区均介于一个高速设备和一个低速设备之间,但高速缓存并不等价于缓冲区,它们之间有着很大的区别

  • 两者存放的数据不同。高速缓存上放的是低速设备上的某些数据的一个备份,也就是说,高速缓存上有的数据,低速设备上必然有;而缓冲区中放的则是低速设备传递给高速设备的数据,这些数据从低速设备传递到缓冲区中,然后再从缓冲区送到高速设备,而在低速设备中却不一定有备份

  • 两者的目的不同。引入高速缓存是为了存放低速设备上经常要被访问到的数据的备份,这样一来,高速设备就不需要每次都访问低速设备,但是如果要访问的数据不在高速缓存中,那么高速设备还是需要访问低速设备;而缓冲区是为了缓和高速设备和低速设备间速度不匹配的矛盾,高速设备和低速设备间每次的通信都要经过缓冲区,高速设备不会直接去访问低速设备

5.2.3 设备分配与回收

设备分配是设备管理的功能之一,当进程向系统提出 I/O 请求之后,设备分配程序将按照一定的分配策略为其分配所需设备,同时还要分配相应的设备控制器和通道,以保证 CPU和设备之间的通信。

设备管理中的数据结构

为了实现对 I/O 设备的管理和控制,需要对每台设备、通道、设备控制器的有关情况进行记录。设备分配依据的主要数据结构有设备控制表(DCT)、设备控制器控制表(COCT)、通道控制表(CHCT)和系统设备表 (SDT)不仅设备要控制表,控制器也要控制表,而且控制控制器的通道也要控制表,同时,作为最终资源的设备也要有个表,就是系统设备表

在这里插入图片描述

  • DCT。系统为每一个设备配置一张设备控制表,用于记录设备的特性以及 I/O 控制器的连接情况。其中,设备状态用来指示设备当前状态(忙/闲),设备等待队列指针指向等待使用该设备的进程组成的等待队列,控制器控制表(COCT)指针指向与该设备相连接的设备控制器。
  • COCT。每个控制器都配有这样一张控制器控制表,用于反映设备控制器的使用状态以及和通道的连接情况等
  • CHCT。每个通道同样配有这样一张通道控制表,用于反映通道的状态等
  • SDT。整个系统只有一张系统设备表,它记录了已连接到系统中的所有物理设备的情况,每个物理设备占用一个表目。SDT 的每个表目包括设备类型、设备标识符、设备控制表指针等信息。其中,设备控制表(DCT)指针指向该设备对应的设备控制表。

设备分配策略

在计算机系统中,请求设备为其服务的进程数往往多于设备数,这样就出现了多个进程对某类设备的竞争问题。为了保证系统有条不地工作,系统在进行设备分配时应考虑以下问题。

  • 设备的使用性质

    • 独享设备。又称为独占设备,应采用独享分配方式,即在将一个设备分配给某进程后便一直由其独占,直至该进程完成或释放设备后,系统才能再将设备分配给其他进程。实际上,大多数低速设备都适合采用这种分配方式;其主要缺点是 I/O 设备通常得不到充分利用。
    • 共享分配。对于共享设备,系统可将其同时分配给多个进程使用,共享分配方式显著提高了设备利用率,但对设备的访问需要进行合理调度。
    • 虚拟分配。虚拟分配是针对虚拟设备而言的,当进程申请独享设备时,系统给它分配共享设备上的一部分存储空间,当进程要与设备交换信息时,系统就把要交换的信息存放在这部分存储空间中;在适当的时候,将设备上的信息传输到存储空间中或将存储空间中的信息传送到设备。
  • 设备分配算法

    • 先来先服务。根据请求的时间顺序构成队列,总是把设备优先分配给队首进程。
    • 优先级高者优先。按照优先级的高低进行设备分配,若优先级相同,则按照先来先服务算法进行分配。
  • 设备分配的安全性

    所谓设备分配的安全性,是指在设备分配中应保证不发生进程的死锁。

    在进行设备分配时,可采用静态分配方式和动态分配方式。静态分配是指在用户作业开始执行之前,由系统一次性分配该作业所需要的所有设备、设备控制器和通道,一旦分配,则一直占用,直至作业撤销。静态分配虽然不会出现死锁,但设备使用效率较低。动态分配是指在进程执行过程中根据执行需要进行设备分配。在进程需要设备时申请,用完后立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法不当,则可能造成死锁

    设备的动态分配方式分为安全分配和不安全分配

    • 在安全分配方式中,每当进程发出I/O 请求后就进入阻塞状态,直到 I/O 完成才被唤醒。这种分配方式摒弃了“请求和保持条件”,不会发生死锁,但进程推进缓慢
    • 在不安全分配方式中,允许进程发出 I/O 请求后仍然运行,且可以继续发出 I/O 请求,因此可能出现一个进程同时操作多个设备的情况,从而使得进程推进迅速,但有可能发生死锁,所以需要在分配设备前进行安全性检测。

设备独立性

设备独立性是指应用程序独立于具体使用的物理设备,它可以提高设备分配的灵活性和设备的利用率。为了提高操作系统的可适应性和可扩展性,现代操作系统无例外地实现了设备独立性(又称设备无关性)。

为了实现设备独立性,引入了逻辑设备和物理设备这两个概念,而系统中需要设置一张逻辑设备表(LUT),其中每个表项中都有逻辑设备名、物理设备名和设备驱动程序入口地址。在应用程序中,使用逻辑设备名来请求使用某类设备,而系统为这个进程分配的逻辑设备对应一个物理设备和设备驱动程序入口地址,这些信息都被放在逻辑设备表的一项中,以后该进程通过逻辑设备名来请求I/O 操作时,就可以找到对应的物理设备和驱动程序入口地址。

设备独立性带来的好处有:设备分配时的灵活性和易于实现 I/O重定向

为了实现设备独立性,必须在设备驱动程序之上设置一层设备独立性软件,用来执行所有 I/O 设备的公用操作,并向用户层软件提供统一接口。关键是系统中必须设置一张逻辑设备表用来进行逻辑设备到物理设备的映射,其中每个表目中包含了逻辑设备名、物理设备名和设备驱动程序入口地址 3 项;当应用程序用逻辑设备名请求I/O设备时,系统必须为它分配相应的物理设备,并在 LUT 中建立一个表目,以后进程利用该逻设备名请求 I/O 操作时,便可从LUT中得到物理设备名和驱动程序入口地址。

操作系统实现设备独立性的方法包括设置设备独立性软件、配置逻辑设备表以及实现逻辑设备到物理设备的映射

设备分配程序

  • 单通路I/O系统的设备分配

    当某一进程提出 I/O 请求后,系统的设备分配程序可以按照下述步骤进行设备分配:

    • 分配设备
    • 分配设备控制器
    • 分配通道

    在分配时,若遇到对应设备忙的情况,则将进程插入到对应的等待队列中。

  • 多通路I/O系统的设备分配

    为了提高系统灵活性,通常采用多通路 I/O 系统结构,即一个设备与多个设备控制器相连,设备控制器也与多个通道相连。当进程提出 I/O 请求时,系统可选择将该类设备中的任何一台设备分配给该进程,步骤如下:

    • 根据设备类型,检索系统设备控制表,找到第一个空闲设备,并检测分配的安全性,若安全,则分配;反之,插入该类设备的等待队列。
    • 设备分配后,检索设备控制器控制表,找到第一个与已分配设备相连的空闲设备控制器,若无空闲,则返回步骤 1) 查找下一个空闲设备。
    • 设备控制器分配后,同样查找与其相连的通道,找到第一个空闲通道,若无空闲通道,则返回步骤 2)查找下一个空闲设备控制器。若有空闲通道,则此次设备分配成功,将相应的设备、设备控制器和通道分配给进程,并启动 I/O 设备,开始信息传输。

设备的回收

当进程使用完对应的 I/O 设备后,释放所占有设备、设备控制器及通道,系统进行回收,修改对应的数据结构,以便下次分配时使用。

5.2.4 假脱机技术

系统中独占设备的数量有限,往往不能满足系统中多个进程的需要,从而成为系统的“瓶颈”,使许多进程因等待而阻塞。另外,分配到独占设备的进程,在整个运行期间往往占有但不经常使用设备,使设备利用率偏低。为克服这种缺点,人们通过共享设备来虚拟独占设备,将独占设备改造成共享设备,从而提高了设备利用率和系统的效率,该技术称为假脱机(SPOOLing)技术

SPOOLing 的意思是同时外设联机操作(Simultaneous Peripheral Operating On-Line),又称为假脱机输入/输出操作。SPOOLing 技术实际上是一种外设同时联机操作技术,也称为排队转储技术。SPOOLing 系统不同于脱机方式。

在这里插入图片描述

SPOOLing 技术是低速输入/输出设备与主机交换的一种技术,其核心思想是以联机的方式得到脱机的效果。低速设备经通道和设在主机内存的缓冲存储器与高速设备相连,该高速设备通常是辅存。为了存放从低速设备上输入的信息,在内存中形成缓冲区,在高速设备上形成输出井和输入井,传递时信息从低速设备传入缓冲区,再传到高速设备的输入井,再从高速设备的输出井传到缓冲区,最后传到低速设备

SPOOLing系统的组成

  • 输入井和输出井。输入井和输出井是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出并模拟脱机输出时的磁盘,用于收容用户程序的输出数据。

  • 输入冲区和输出缓冲区。输入缓冲区和输出缓冲区是在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备传递过来的数据,然后再传送到输入井。输出缓冲区用于暂存从输出井传递过来的数据,然后再传送到输出设备。

  • 输入进程和输出进程。输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入设备通过输入缓冲区再传递到输入井。当需要输入数据时,CPU 直接将数据从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井等输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。

将一台独享打印机改造为可供多个用户共享的打印机,是应用 SPOOLing 技术的典型实例。具体做法是:系统对于用户的打印输出,并不真正把打印机分配给该用户进程,而是先在输出井中申请一个空闲盘块区,并将要打印的数据送入其中;然后为用户申请并填写请求打印表,将该表挂到请求打印队列上。若打印机空闲,输出程序从请求打印队首取表,将要打印的数据从输出井传送到内存缓冲区,再进行打印,直到打印队列为空

SPOOLing技术的特点

  • 提高了 I/O速度。从对低 I/O 设备进行的操作变为对输入井或输出井的操作,如同脱机操作一样,提高了 I/O 速度,缓和了 CPU 与低速 I/O 设备速度不配的矛盾。
  • 设备并没有分配给任何进程。在输入井或输出井中,分配给进程的是一个存储区和建立一张 I/O 请求表。
  • 实现了虚拟设备功能。多个进程同时使用一个独享设备,而对每一进程而言,都认为自己独占这一设备,从而实现了设备的虚拟分配。不过,该设备是逻辑上的设备。
  • SPOOLing 除了是一种速度匹配技术外,也是一种虚拟设备技术。它用一种物理设备模拟另一类物理设备,使各作业在执行期间只使用虚拟的设备,而不直接使用物理的独占设备。这种技术可使独占的设备变成可共享的设备,使得设备的利用率和系统效率都能得到提高。

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/129809470