暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

详解操作系统的I/O管理

海人为记 2021-10-03
3111

I/O 设备管理的主要对象是 I/O 设备和相应的设备控制器。其最重要的任务是完成用户提出的 I/O 请求,提高 I/O 速率以及设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。I/O 管理应具有如下功能:

  1. 状态跟踪。要能实时掌握外部设备的状态。
  2. 设备存取。要实现对设备的存取操作。
  3. 设备分配。在多用户环境下,负责设备的分配与回收。
  4. 设备控制。包括设备的驱动、完成和故障的中断处理。

I/O 设备

I/O 设备指的是能将数据输入到计算机,或者能接收计算机输出的数据的设备。I/O 设备种类繁多,可以根据使用特性、信息交换单位或传输速率进行分类,如下所示。

I/O 设备按使用特性分为以下几种类型:

  1. 人机交互类外部设备,用于与用户之间进行交互,如打印机、显示器等,通常以字节为单位进行数据交换。
  2. 存储设备,用于存储程序和数据,如磁盘、磁带等,通常以多字节组成的块为单位进行数据交换。
  3. 网络通信设备,用于与远程设备通信,如网络接口、调制解调器等。

I/O 设备按传输速率分为以下几种类型:

  1. 低速设备,传输速率为几秒几字节至数百字节,如键盘、鼠标等。
  2. 中速设备,传输速率为每秒数千字节至数十万字节,如行式打印机、激光打印机等。
  3. 高速设备,传输速率在数十万字节至千兆字节,如磁带机、磁盘机、光盘机等。

I/O 设备按信息交换的单位分如下几种类型:

  1. 块设备,指的是信息存取以数据块为单位的设备,每个块有自己的地址,独立于其他块而读写,属于有结构设备,如磁盘等。
  2. 字符设备,指的是信息存储以字符为单位的设备,发送或接收一个字符流,不考虑任何块结构,不可寻址,传输时常采用中断驱动方式,属于无结构类型,如交互式终端机、打印机等。

I/O 设备要想与 CPU
进行通信,首先需要与设备控制器通信,因此,I/O 设备中应含有与设备控制器间的接口,而该接口中有三种类型的信号,如下图所示。

  • 数据信号量,用于在设备和设备控制器之间传送数据信号。
  • 控制信号量,由设备控制器向设备发送控制信号时的通路。
  • 状态信号量,用于传送指示设备当前状态的信号。

设备控制器

设备控制器的通过控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。它是 CPU
与 I/O 设备之间的接口,接收从 CPU
发来的命令,去控制 I/O 设备工作,使处理器能够从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址的设备,有多个设备地址,每个设备地址对应一个设备。设备控制器分为控制字符设备的控制器与控制块设备的控制器两类。设备控制器的基本功能如下所示。

  1. 接收和识别 CPU
    或通道发来的命令。控制器中具有相应的控制寄存器,用来存放接收的命令和参数,并对所接收的命令进行译码。
  2. 实现数据交换。实现 CPU
    与控制器、控制器与设备之间的数据交换。
  3. 标识和报告设备状态。控制器中设置状态寄存器,用以记下设备状态供 CPU
    处理使用。
  4. 设备地址识别。设备控制器中配置地址译码器,用以识别其所控制的每个设备的地址,且地址唯一。
  5. 数据缓冲区。控制器中设置缓冲区,用以缓存设备输入或主机输出时的数据。
  6. 差错控制。I/O 设备送来的数据,设备控制器还兼管进行差错检测。发现错误,通常将差错检测码置位,并报告 CPU

为实现上述功能,设备控制器的组成所包含的组成部分如下图所示。

  1. 设备控制器与处理器的接口,用于实现 CPU
    与设备控制器之间的通信,该接口中共有数据线、地址线和控制线三种。数据线通常与数据寄存器或控制/状态寄存器相连接。
  2. 设备控制器与设备的接口,用于实现 I/O 设备与设备控制器之间的通信,两者连接需要相应数量的接口,一个接口连接一台设备。每个接口中存在数据、控制和状态三种类型的信号。控制器中的 I/O 逻辑根据 CPU
    发来的地址信号去选择一个设备接口。
  3. I/O 逻辑,用于实现对设备的控制。它通过一组控制线与 CPU
    交互,对从 CPU
    收到的 I/O 命令进行译码。CPU
    启动设备时,将启动命令发送给控制器,同时通过地址线把地址发送给控制器,由控制器的 I/O 逻辑对地址进行译码,并相应地对所选设备进行控制。

I/O 控制方式

设备管理的主要任务之一是控制设备和内存或处理器之间的数据传送,而设备和内存之间控制方式有如下几种方式。

程序直接控制方式

如下图所示,计算机通过轮询的方式从设备读取数据到存储器,每次读一个字的数据,直到确定该字已经在 I/O 控制器的数据寄存器中。

该方式简单且易于实现,但由于 CPU
和 I/O 设备只能串行工作,致使 CPU
绝大部分时间处于等待 I/O 设备完成数据 I/O 的循环测试中,造成 CPU
资源的极大浪费,利用率相当低。之所以要不断地测试 I/O 设备的状态,是因为 CPU
未采用中断机制,使 I/O 设备无法向 CPU
报告它已完成一个字符的输入操作。

中断驱动方式

中断驱动方式允许 I/O 设备主动打断 CPU
的运行请求服务,从而解放 CPU
,使得其向 I/O 控制器发送读命令后可以继续做其他有用的工作。如下图所示。

从 I/O 控制器的角度来看,I/O 控制器从 CPU
接收一个读命令,然后从设备读数据。一旦数据读入该 I/O 控制器寄存器,便通过控制线给 CPU
发出一个中断信号,表示数据已准备好,然后等待 CPU
请求该数据。I/O 控制器收到 CPU
发出的取数据请求后,将数据放到数据总线上,传到 CPU
的寄存器中。至此,本次 I/O 操作完成,I/O 控制器又开始下一次 I/O 操作。

CPU
的角度来看,CPU
发出读命令,然后保存当前运行程序的上下文,转去执行其他程序。在每个指令周期的末尾,CPU
检查中断。当有来自 I/O 控制器的中断时,CPU
保存当前正在运行程序的上下文,转去执行中断处理程序以处理该中断。这时,CPU
从 I/O 控制器读一个字的数据传送到寄存器,并存入主存。接着,CPU
恢复发出 I/O 命令的程序的上下文,然后继续运行。

中断驱动方式比程序直接控制方式有效,但由于数据中的每个字在存储器与 I/O 控制器之间的传输都必须经过 CPU
,这就导致了中断驱动方式仍然会消耗较多的 CPU
时间。

直接存储器存取方式

中断驱动方式中的设备与内存之间的数据交换也要经过 CPU
中的寄存器,所以速度还是会受限,而直接存储器存取方式(Direct Memory Access,DMA)是在 I/O 设备和内存之间开辟直接的数据交换通路,彻底解放 CPU
。DMA 方式的特点如下所示。

  1. 数据传输的基本单位是数据块。
  2. 所传送的数据是从设备直接送入内存的,或者相反。
  3. 仅在传送一个或多个数据块的开始和结束时,才需 CPU
    干预,整块数据的传送是在 DMA 控制器的控制下完成的。

DMA 控制器主要由主机与 DMA 控制器的接口、DMA 控制器与块设备的接口以及 I/O 控制逻辑三部分组成,如下图所示。

为了在主机与控制器之间直接实现成块数据的直接交换,必须在 DMA控制器中设置如下四类寄存器。

  1. 命令/状态寄存器 CR,用于接收从 CPU
    发来的 I/O命令,或有关控制信息,或设备的状态。
  2. 内存地址寄存器 MAR,在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内部才能到设备的内存源地址。
  3. 数据寄存器 DR,用于暂存从设备到内存或内存到设备的数据。
  4. 数据计数器 DC,存放本次要传送的字(节)数。

如下图所示,CPU
接收到 I/O 设备的 DMA 请求时,它给 I/O 控制器发出一条命令,启动 DMA 控制器,然后继续其他工作。之后 CPU
就把控制器操作委托给 DMA 控制器,由该控制器负责处理。DMA 控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要 CPU
参与。传送完成后,DMA 控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要 CPU
的参与。

中断驱动方式在每个数据需要传输时中断 CPU
,而 DMA 控制方式则是在所要求传送的一批数据全部传送结束时才中断 CPU
;此外,中断驱动方式数据传送是在中断处理时由 CPU
控制完成的,而 DMA 控制方式则是在 DMA 控制器的控制下完成的。

通道控制方式

I/O 通道是指专门负责 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 软件具有清晰的结构、良好的可移植性和适应性,每层都利用其下层提供的访问,完成 I/O 功能的某些子功能,并屏蔽功能实现细节,向上层提供服务。通常将 I/O 软件划分为四个层次,各层次及其功能如下图所示。

用户层 I/O 软件

用户层 I/O 软件,实现与用户交互的接口,用户可直接调用在用户层提供的、与 I/O 操作有关的库函数,对设备进行操作。

一般而言,大部分的 I/O 软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。用户层软件必须通过一组系统调用来获取操作系统服务。

设备独立性软件

设备独立型软件,用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。

设备独立性也称设备无关性,使得应用程序不局限于具体的物理设备,提高了 I/O 系统可适应性和可扩展性。为使设备独立而引入逻辑设备和物理设备。应用程序中使用逻辑设备名来请求使用某类设备;系统实际执行时,将逻辑设备名映射成物理设备名使用。

使用逻辑设备名可以增加设备分配的灵活性和易于实现 I/O 重定向。所谓 I/O 重定向,即用于 I/O 操作的设备可以重定向,而不必改变应用程序。

为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。设备独立性软件中包括了执行所有设备公有操作的软件,如下所示。

  1. 向上层提供统一的调用接口,如各种设备的读写操作。
  2. 缓冲管理。为设备提供了相应的缓冲区,如单缓冲区、双缓冲区、循环缓冲区、公用缓冲池等,以满足不同情况的需求。
  3. 差错控制。需要对设备的错误进行处理,可分为暂时性错误和持久性错误。
  4. 对独立设备的分配与回收。独占设备由系统统一分配,当使用时,先提出申请,系统检查设备空闲时才会分配,否则,进程将被阻塞,放入请求队列中等待。
  5. 独立于设备的逻辑数据块。不同类型的设备的数据交换单位不同,读取和传输速率也不同,设备独立性软件会屏蔽差异,并向上层提供统一的逻辑数据块。

设备驱动程序

设备驱动程序与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序。

通常,每类设备配置一个设备驱动程序,它是 I/O 进程与设备控制器之间的通信程序,常以进程形式存在。设备驱动程序向上层应用程序提供一组标准接口,设备具体的差别被设备驱动程序所封装,用于接收上层软件发来的抽象 I/O 要求,如 read
write
命令,转换为具体要求后,发送给设备控制器,控制 I/O 设备工作;它也将由设备控制器发来的信号传送给上层软件,从而为 I/O 内核子系统隐藏设备控制器之间的差异。

为实现 I/O 系统的高层与设备控制器之间的通信,设备驱动程序应具有以下功能:

  1. 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列。
  2. 检查用户 I/O 请求的合法性,了解 I/O 设备的工作状态,传递与 I/O 设备操作有关的参数,设置设备的工作方式。
  3. 发出 I/O 命令,如果设备空闲,便立即启动 I/O 设备,完成指定的 I/O 操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待。
  4. 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。

根据在设备处理时设置的进程,把设备处理方式分为三类,如下所示。

  1. 为每一类设备设置一个进程,专门用于执行这类设备的 I/O 操作。
  2. 在整个系统中设置一个 I/O 进程,专门用于执行系统中所有各类设备的 I/O 操作。也可以设置一个输入进程和一个输出进程,分别处理系统中的输入或输出操作。
  3. 不设置专门的设备处理进程,而只为各类设备设置相应的设备驱动程序,供用户或系统进程调用。

设备驱动程序主要任务是启动指定设备,完成上层指定的 I/O 工作,但启动完成前,设备驱动程序还要经过如下处理过程:

  1. 将抽象要求转换为具体要求。
  2. 对服务请求进行校验。
  3. 检查设备的状态。
  4. 传送必要的参数。
  5. 启动 I/O 设备。

中断处理程序

中断处理程序,用于保存被中断进程的 CPU
环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断进程。

中断处理层的主要任务有进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,故应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。

中断处理程序的处理过程可分为如下几个步骤:

  1. 测定是否有未响应的中断信号。
  2. 保护被中断进程的 CPU
    环境。
  3. 转入相应的设备处理程序。
  4. 中断处理。
  5. 当中断处理完成后,恢复 CPU
    现场并退出中断。

I/O 操作完成后,驱动程序必须检查本次 I/O 操作是否发生了错误,并向上层报告,最终向调用者报告本次 I/O 的执行情况。

硬件设备

I/O 设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开,电子部件称为设备控制器或适配器,在个人计算机中,通常是一块插入主板扩充槽的印制电路板;机械部件则是设备本身。

缓冲区管理

在设备管理中,引入缓冲区的目的主要如下:

  1. 缓和 CPU
    与 I/O 设备间速度不匹配的矛盾。
  2. 减少对 CPU
    的中断频率,放宽对 CPU
    中断响应时间的限制。
  3. 解决基本数据单元大小不匹配的问题。
  4. 提高 CPU
    和 I/O 设备之间的并行性。

实现缓存区可以采用 硬件缓冲器
利用内存作为缓冲区
,因为硬件缓冲器成本高,一般不采用,更多是利用内存作为缓冲区。

缓冲区有一个特点,即当缓冲区的数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满后,才能从缓冲区把数据传出。

根据系统设置缓冲器的个数,缓冲技术有单缓冲区、双缓冲区、 循环缓冲以及缓冲池。

单缓冲区

在设备和处理器之间设置一个缓冲区。设备和处理器交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理器从缓冲区取走数据。

如下图所示,在块设备输入时,假定从磁盘把一块数据输入缓冲区的时间为 T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,而 CPU
对这一块数据处理的时间为 C。

假设 ,从初始状态开始,当工作区数据处理完后,时间为 C,缓冲区还没充满,当缓冲区充满时,经历了 T 时间,停止再冲入数据,然后缓冲区向工作区传送数据,当工作区满了以后,缓冲区的数据同时也为空。用时为 M,到达下一个开始装填,整个过程用时 ;若 ,同理,整个过程用时 。故单缓冲区处理每块数据的用时表示为

字符设备输入时,缓冲区用于暂存用户输入的一行数据,在输入期间,用户进程被挂起以等待数据输入完毕;输出时,用户进程将一行数据输入到缓冲区后继续进行处理。当用户进程已有第二行数据输出时,如果第一行数据尚未被提取完毕,则此时用户进程应阻塞。

双缓冲区

根据单缓冲区的特点,CPU
在传送时间 M 内处于空闲状态,由此引入双缓冲区,也称缓冲对换。I/O 设备输入数据时先将数据送入缓冲区1,在缓冲区1 装满后才开始装缓冲区2,与此同时处理器可以从缓冲区1 中取出数据放入用户进程处理,当缓冲区1 中的数据处理完后,若缓冲区2 已填满,则处理器又从缓冲区2 中取出数据放入用户进程处理,而 I/O 设备又可以装缓冲区1。注意,必须等缓冲区2 充满后才能取数据。双缓冲机制提高了处理机和输入设备的并行操作的程度。

假设缓冲区1 是空的,缓冲区2 是满的。如下图所示,假设 ,缓冲区2 开始向工作区传送数据,缓冲区1 开始冲入数据,当工作区充满数据后,缓冲区为空,时间为 M,然后工作区开始处理数据,缓冲区1 继续冲入数据,因此此时只有一个 I/O 设备,所以缓冲区2 虽然为空,但不能冲入数据。当缓冲区1 充满数据后,工作区的数据还未处理完毕,时间为 T,当工作区数据处理完毕后,此时工作区为空,缓冲区1 满,缓冲区2 为空,达到下一个初始状态,用时

时,缓冲区2 开始向工作区传送数据,缓冲区1 开始冲入数据,当工作区充满数据并处理完毕后,用时 ,但缓冲区1 的数据还未充满;当事件为 T 时,缓冲区1 的数据充满,到达下一个初始状态。由此可得,双缓冲区处理一块数据的用时为

,可使块设备连续输入:若 ,则可使 CPU
不必等待设备输入。对于字符设备,若采用行输入方式,则采用双缓冲可使用户在输入第一行后,在 CPU
执行第一行中的命令的同时,用户可继续向第二缓冲区输入下一行数据,而单缓冲情况下则必须等待一行数据被提取完毕才可输入下一行的数据。

如下图所示,若两台机器之间通信仅配置了单缓冲区,则它们在任意时刻都只能实现单方向的数据传输,决不允许双方同时向对方发送数据。

如下图所示,为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个作用发送缓冲区,另一个用作接收缓冲区。

循环缓冲区

当输入与输出速度基本相匹配时,采用双缓冲区能获得较好的效果,但两者速度相差甚远时,就不够理想,可以增加缓冲区数量,来改善情况。引入多缓冲区后形成环形缓冲区。

环形缓冲区包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。

循环缓冲用于输入输出时,还需要有两个指针 in
out
。对输入而言,首先要从设备接收数据到缓冲区中,in
指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据,out
指针指向可以提取数据的第一个满缓冲区。输出则正好相反。

缓冲池

缓冲池由多个系统公用的缓冲区组成,包含了用于管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区。

缓冲区按其使用情况形成了空白缓冲队列、装满输入数据的缓冲队列以及装满输出的缓冲队列三个队列。还应具有用于收容输入数据的工作缓冲区 hin、用于提取输入数据的工作缓冲区 sin、用于收容输出数据的工作缓冲区 hout 及用于提取输出数据的工作缓冲区 sout 四种缓冲区,如下图所示。

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

设备分配

设备分配是指根据用户的 I/O 请求分配所需的设备。分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。从设备的特性来看,可分为独占设备、共享设备和虚拟设备。

  1. 独占设备。将一个设备分配给某进程后,由其独占,不允许其他进程使用,直至该进程完成或释放该设备后才允许其他进程使用。
  2. 共享设备。将一个设备分配给某进程后,其他进程也可使用,通过分时共享提高利用率,但需注意对进程访问设备的先后次序进行合理调度。
  3. 虚拟设备。采用假脱机 I/O 技术将设备改造成虚拟的共享设备,可同时分配给多个进程使用。假脱机 I/O 技术也叫 SPOOLing 技术。

设备分配的数据结构

设备分配的主要数据结构有 设备控制表
(DCT)、控制器控制表
(COCT)、通道控制表
(CHCT)和 系统设备表
(SDT),各数据结构功能如下所示。

设备控制表(DCT):系统为每一个设备配置一张设备控制表,用于记录设备的情况, 控制表中的表项是设备的各个属性,如下图所示。

设备控制表含有下列字段:

  1. 设备类型 type,用于描述设备使用类型,如打印机、键盘等。
  2. 设备标识符 deviceid,物理设备名,系统中的物理设备名唯一。
  3. 设备状态:用于表示当前设备的状态,如等待/不等待,忙/闲。
  4. 指向控制器表的指针,指向该设备所连接的控制器的控制表。
  5. 重复执行次数或时间,发生错误时应重复执行的次数或时间,如重复执行次数达到规定值之前能正常传送,或规定时间内正常传送,则认为传送成功。
  6. 设备队列队首指针,指向正在等待该设备的由进程的进程控制块组成的队列,其队首指针指向队首的进程控制块。

控制器控制表(COCT):每个控制器对应一张控制器控制表,用于记录控制器情况,如下图所示。

通道控制表(CHCT):每个通道都有一张通道控制表,如下图所示。

系统设备表(SDT):记录了已连接到系统中所有物理设备的情况,每个物理设备占一个表目,其中包括有设备类型、设备标识符、设备控制表及设备驱动程序的入口等项,如下图所示。

设备分配策略

根据设备特性、用户要求和系统配置情况等情况对设备分配,既要充分发挥设备使用效率,又要避免造成死锁,还要将用户程序和具体设备隔离开。设备分配有静态分配和动态分配两种。

静态分配主要用于对独占设备的分配,它在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器(如通道等)。一旦分配,这些设备、控制器(和通道)就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低。因此,静态分配方式并不符合分配的总原则。

动态分配在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备、I/O 控制器,一旦用完,便立即释放。动态分配方式有利于提高设备的利用率,但若分配算法使用不当,则有可能造成进程死锁。

对设备分配的算法,通常采用先请求先分配、优先级高者优先等分配算法。

对于独占设备,既可以采用动态分配方式,又可以采用静态分配方式,但往往采用静态分配方式,即在作业执行前,将作业所要用的这一类设备分配给它。共享设备可被多个进程所共享,一般采用动态分配方式,但在每个 I/O 传输的单位时间内只被一个进程所占有,通常采用先请求先分配和优先级高者优先的分配算法。

设备分配的安全性

设备分配的安全性是指设备分配中应防止发生进程死锁。

  1. 安全分配方式。每当进程发出 I/O 请求后便进入阻塞态,直到 I/O 操作完成时才被唤醒。这样,一旦进程已经获得某种设备后便阻塞,不能再请求任何资源,而且在它阻塞时也不保持任何资源。优点是设备分配安全;缺点是 CPU
    和 I/O 设备是顺序工作的。
  2. 不安全分配方式。进程在发出 I/O 请求后继续运行,需要时又发出第二个、第三个 I/O 请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞态。优点是一个进程可同时操作多个设备,使进程推进迅速;缺点是设备分配可能产生死锁。

设备分配步骤

当某进程提出 I/O 请求后,设备分配程序按如下所示的步骤进行分配。

  1. 根据 I/O 请求中的物理名查找 SDT。
  2. 根据 SDT 找出 DCT,若设备状态为忙,便将请求 I/O 的进程的 PCB
    挂在等待队列上;若不忙,将设备分配给请求进程。
  3. 根据 DCT 找出 COCT,若控制器状态为忙,便将请求 I/O 进程的 PCB
    挂在控制器的等待队列上;若不忙,便将该控制器分配给进程。
  4. 根据 COCT 找出 CHCT,若通道状态为忙,便将请求 I/O 的进程的 PCB
    挂在该通道的等待队列上;若不忙,将该通道分配给进程。

只有在设备、控制器和通道三者都分配成功时,这次的设备分配才算成功。然后,便可启动该 I/O 进行数据传送。

上述进程以物理名提出 I/O 请求,不具有设备无关性。为获得设备独立性,进程应使用逻辑设备名请求 I/O。系统首先从 SDT 中找出第一个该类设备的 DCT。若该设备忙,又查找第二个该类设备的 DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上。而只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。如安全,便可把设备分配给它。

逻辑设备名到物理设备名的映射

为了提高设备分配的灵活性和设备的利用率,方便实现 I/O 重定向,引入了设备独立性。设备独立性是指应用程序独立于具体使用的物理设备。

为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备,在系统中设置一张逻辑设备表(Logical Unit Table,LUT),用于将逻辑设备名映射为物理设备名。LUT 表项包括 逻辑设备名
物理设备名
设备驱动程序入口地址

如下图所示,当进程用逻辑设备名来请求分配 I/O 设备时,系统为它分配相应的物理设备,并在逻辑设备表中建立一个表项,以后进程再利用逻辑设备名请求 I/O 操作时,系统通过查找逻辑设备表来寻找相应的物理设备和驱动程序。

在系统中可采取两种方式建立逻辑设备表:

  1. 在整个系统中只设置一张逻辑设备表。所有进程的设备分配情况都记录在这张表中,故不允许有相同的逻辑设备名,适用于单用户系统。
  2. 为每个用户设置一张逻辑设备表。当用户登录时,系统便为该用户建立一个进程,同时也为之建立一张逻辑设备表,并为该表放入进程的进程控制块,适用于多用户系统。

假脱机技术

假脱机 I/O 技术利用专门的外围控制器,将低速 I/O 设备上的数据传送到高速磁盘上,或者相反,从而缓和 CPU
高速性与 I/O 设备低速性之间的矛盾。

SPOOLing(Simultaneaus Periphernal Operating OnLine)技术是外部设备与 CPU
对数据的处理同时进行的技术,也称为假脱机技术,它提高了 I/O 的速度,将独占设备改造成共享设备,实现了虚拟设备的功能。

SPOOLing 系统的组成如下图所示。

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

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

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







文章转载自海人为记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论