文章目录


1. I/O 系统的基本功能和层次结构

I/O 系统是用于实现数据输入、输出和存储的系统,最主要的任务是完成用户提出的 I/O 请求、提高 I/O 速率以及折别的利用率,并为更高层的进程方便地使用 I/O 设备提供手段。

1.1 I/O 系统的基本功能

  1. 隐藏物理设备的细节。I/O 设备不仅种类繁多,而且它们的特性和操作方式往往也存在很大差异,为了方便用户使用 I/O 设备,I/O 系统必须对 I/O 设备进行适当的抽象,以隐藏掉物理设备的实现细节,而统一向用户提供少量的、抽象的读/写命令。
  2. 与设备的无关性。允许应用程序通过抽象的逻辑设备名来请求使用某类设备,使得应用程序独立于具体使用的物理设备,从而有效地提高 OS 的可移植性和易适应性。
  3. 提高处理机和 I/O 设备的利用率。应尽量减少处理机对 I/O 设备的干预,提高处理机和 I/O 设备并行操作的程度,以提高它们的利用率。
  4. 对 I/O 设备进行控制。
  5. 确保对设备的正确共享。对不同类型的设备应采用不同的分配方式。
  6. 错误处理。对于这类错误,应该尽可能在接近硬件的层面上处理,只有低级软件解决不了的错误才需要向上层报告,请求上层软件解决。

1.2 I/O 系统的层次结构

通常,将 I/O 软件从高到低分成以下几个层次:

  1. 用户层 I/O 软件。实现与用户交互的接口,用户可直接调用该层所提供的与 I/O 操作有关的库函数,对设备进行操作。
  2. 设备独立性软件。用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
  3. 设备驱动程序。与硬件直接相关,用于具体实现系统对设备发出操作指令以驱动 I/O 设备进行数据传输等工作。
  4. 中断处理程序。用于在设备完成 I/O 操作后,根据 I/O 操作的具体完成情况,进行 I/O 操作的结束处理。

2. I/O 硬件

2.1 I/O 设备

  1. 按信息交换的单位分类。分为块设备和字符设备两种。块设备(磁盘、磁带)的信息存取以数据块为单位,其传送速率较高,对块设备的访问可以寻址;字符设备(终端、打印机)的信息存取以字符为单位,其传送速率较低,对字符设备不能寻址。
  2. 按使用特性分类。分为存储设备和 I/O 设备两类。存储设备的存取速度不如内存,但容量却比内存大得多,价格也便宜。I/O 设备主要用来接收外部信息或将计算机处理后的信息送向计算机外部。
  3. 按传输速率分类。分为低速设备、中速设备和高速设备。低速设备(键盘、鼠标)的传输速率仅为每秒钟几个字节至数百个字节;中速设备(打印机)的传输速率每秒数千至数万个字节;高速设备(磁盘机、光刻机)的传输速率为每秒钟数万个字节至数十兆字节。

2.2 设备控制器

设备控制器是 CPU 与 I/O 设备之间的硬件接口,它接收从 CPU 发来的命令,并去控制一个或多个设备。
设备控制器中设有一组寄存器, CPU 通过向其中的控制寄存器来写命令字来执行 I/O 操作,如果某个命令带有参数,则还需将这些参数写到控制器的相应寄存器中。接收到命令后,设备控制器将按命令的要求独立的地去控制指定进行输入/输出,CPU 可转去执行其他工作。输入/输出地完成情况与设备地状态信息均由控制器存放在自己的状态寄存器中,当控制器完成与设备之间的数据交换后,它将产生一个中断。CPU 可通过读控制器中的寄存器来了解操作的结果和设备的状态。

2.3 I/O 寄存器的访问方式

CPU 可通过两种方式来读写控制器内的寄存器。第一种方式是给每个控制器分配一个 I/O 端口号,并通过专门的 I/O 指令(IN REG,PORT,OUT PORT,REG)来读写控制器的寄存器。第二种方式被称作内存映射I/O,此时,I/O寄存器是内存地址空间的一部分,即为每个控制器分配一个唯一的内存地址,而该地址不会被分配给内存单元,这样便可以采用与访问内存同样的方式来访问 I/O 寄存器。

2.4 I/O 通道

在大、中型计算机系统中,I/O 的管理工作交给了一个专门的部件——I/O 通道,是一个独立于主机 CPU 的、专门用来管理 I/O 的特殊处理机,它有自己的指令系统,其中的指令被称作通道指令。通道所执行的程序被称作通道程序,通道程序被存放在主机的内存中,有自己的总线控制部分,可以控制设备与内存直接进行数据交换。
有了通道后,CPU 仅需要发出一条 I/O 指令给通道,说明要执行的 I/O 操作和要访问的 I/O 设备,便可进行其他工作。包括 I/O 操作的组织和管理、数据的传送将完全由通道控制,并在全部操作完成后向主机 CPU 发送中断信号。

通道类型:

  1. 字节多路通道。
  2. 数组选择。
  3. 数组多路。

2.5 中断

中断是指 CPU 在执行一个程序时,对系统中发生的某个事件做出的一种反应:CPU 暂停正在执行的程序,保留现场后自动转去处理相应的事件,处理完该事件后,到适当的时候返回断点,继续完成被打断的程序。他是多道程序得以实现的基础。
根据引起中断的事件类型,可将中断分为外部中断(中断)和陷入(异常)。前者是由 CPU 以外的外部事件引起,如 I/O 设备引起的 I/O 中断;后者是 CPU 执行指令过程中检测到的一些内部事件引起的,如非法指令、地址越界等引起的中断。
每一种中断或陷入都有一个与之相联系的中断号,并有一个与之相联系的中断处理程序,CPU 通过执行相应的中断处理程序来完成对应事件的处理。每种中断或陷入的中断处理程序按中断号的顺序存放在一张中断向量表或中断描述符表中。在中断响应时,系统会根据中断号去查找中断向量表或中断描述符表,从中获得相应的中断处理程序的入口地址,这样便可以转入中断处理程序执行。

3. 中断处理程序和设备驱动程序

3.1 I/O 中断处理程序

I/O 设备完成 I/O 操作后,设备控制器便向 CPU 发送一个 I/O 中断信号。 CPU 响应中断时,并保存被中断进程 的 CPU 现场,然后分析中断原因并通过中断向量表转去执行相应的 I/O 中断处理程序。I/O 中断处理程序的工作过程如下:

  1. 检查本次 I/O 操作的完成情况。中断处理程序通过读设备控制器的状态寄存器来检查本次 I/O 操作的完成情况。
  2. 进程 I/O 结束或错误处理。
  3. 唤醒被 I/O 操作阻塞的进程。I/O 中断处理程序还必须唤醒等待本次 I/O 完成的相应进程,以使它能继续向前推进。
  4. 启动下一个请求。
  5. 中断返回。

3.2 设备驱动程序

设备驱动程序是 I/O 进程与设备控制器之间的通信程序,它接收来自上层软件的、抽象的 I/O 命令,再把它转换成具体要求后,发送给设备控制器,从而启动设备进行数据传送。设备驱动程序的处理过程如下:

  1. 将抽象要求转换成具体要求。操作系统对用户屏蔽了有关物理设备的具体细节,并提供给用户一个一致的 I/O 接口,驱动程序必须将用户进程或上层软件发出的 I/O 请求按设备控制器所要求的格式的格式转换成具体的命令,如将 read 命令中的盘块号按地址寄存器的格式转换成盘面、磁道及扇区号。
  2. 检查 I/O 请求的合法性。
  3. 读出和检查设备的状态。
  4. 传送必要的参数。对带有 I/O 命令,驱动程序必须将这些参数,传送到设备控制器的相应寄存器中。
  5. 启动 I/O 设备。

驱动程序发出 I/O 命令后,基本的 I/O 操作是在设备控制器的控制下进行的。

3.3 I/O 控制方式

  1. 轮询方式。CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,会造成 CPU 的极大浪费。
  2. 中断方式。当用户进程要启动某个 I/O 设备进行输入时,由 CPU 向相应的设备控制器发出一条 I/O 命令,然后阻塞用户进程并将 CPU 调度给其他就绪进程;当相应的 I/O 设备完成输入工作时,设备控制器将向 CPU 发送一个 I/O 中断信号;CPU 相应中断,由 I/O 中断处理程序进行差错检查,将数据缓冲寄存器中的数据传送到内存指定的单元中,并唤醒被阻塞的用户进程。
  3. 直接存储器访问(DMA)方式。在 DMA 方式中,当进程要求设备输入数据时,CPU 将 I/O 命令发送到 DMA 控制器的命令寄存器中,并把准备存放输入数据的内存始址以及要传送的字节数分别入 DMA 控制器的内存地址寄存器和计数器中,然后启动 DMA 控制器进行数据传送;等待输入数据的用户进程被阻塞,CPU 被调度给其他就绪进程。同时,在 DMA 控制器的控制下,输入设备将不断地挪用 CPU 的存储周期,把输入数据通过 DMA 控制器的数据寄存器传送到指定的内存位置;当所要求的字节数全部传送完毕后,DMA 控制器将向 CPU 发出一个 I/O 中断信号;CPU 响应中断,由中断处理程序进行善后处理,并唤醒被阻塞的用户进程。在 DMA 方式中,仅在传送一个数据块的开始和结束时,才需要 CPU 干预,整块数据的传送是在 DMA 控制器的控制下直接完成的。
  4. I/O 通道控制方式。在 I/O 通道方式中,当用户进程发出 I/O 请求时,CPU 只需向 I/O 通道发出一条 I/O 指令,以给出其所要执行的通道程序的始址和要访问的 I/O 设备;用户进程阻塞以等待 I/O 完成,而通道则通过执行通道程序控制设备控制器,从而控制设备完成指定的 I/O 任务,然后向 CPU 发 I/O 中断信号;CPU 响应中断,进行善后处理并唤醒被阻塞的进程。I/O 通道方式把以一个数据块的读(或写)为单位的干预,减少为以一组数据块的读(或写)为单位的干预。

4. 与设备无关的 I/O 软件

4.1 设备无关系的基本概念

设备无关性,也叫设备独立性,是指应用程序与具体使用的物理设备无关。引入设备无关性,可增加设备分配的灵活性,提高设备的利用率,并且使得 I/O 重定向易于实现。
在应用程序中,使用逻辑设备名称来请求使用某类设备,而系统在实际执行时,还是必须使用物理设备。因此,系统中必须设置一张逻辑设备表 LUT,其每个表目中包含了逻辑设备名称、物理设备名称和设备驱动程序入口地址三项。当应用程序用逻辑设备名称请求分配 I/O 设备时,系统为它分配相应的物理设备,并在 LUT 中建立一个表目。以后进程利用该逻辑设备名称请求 I/O 操作时,便可从 LUT 中得到物理设备名称和驱动程序入口地址。

4.2 设备独立性软件

为每个设备配置的设备驱动程序,是与硬件紧密相关的软件。为了实现设备独立性,必须在设备驱动程序之上设置一层软件,称为设备无关性的 I/O 软件,或设备独立性软件。设备独立性软件首先是执行所有设备的共用操作,包括:缓冲管理、差错控制、对独立设备的分配和回收、提供独立于设备的逻辑数据块、逻辑设备到物理设备的映射、设备的保护等;其次是向用户层提供一个设备驱动程序的统一的接口。

4.3 设备分配

  1. 设备分配中的数据结构。设备控制表 DCT、控制器控制表 COCT、通道控制表 CHCT、系统设备表 SDT。
  2. 独占设备的分配程序。当进程提出 I/O 请求后,设备分配程序首先根据进程给出的物理设备名称,查找系统设备表 SDT,从中找到该设备的 DCT;再检查 DCT 中的设备状态字段,若设备处于忙状态,则将请求 I/O 的进程插入设备等待队列;否则,便按照一定的算法来计算本次设备分配的安全性,若分配不会导致系统进入不安全状态,便将设备分配给请求进程,否则仍将该进程插入设备等待队列。设备分配成功后,设备分配程序将通过 DCT 找到与该设备相连接的控制器的 COCT,检查 COCT 的状态字段,若控制器忙,便将请求进程插入控制器等待队列,否则,便将该控制器分配给请求进程。分配控制器后,通过 COCT 又可以找到该控制器连接的通道的 CHCT,进行通道的分配。只有在设备、控制器和通道三者都分配成功时,这次设备的分配才算成功,然后,系统便可以启动该设备进行数据传送。

4.4 缓冲管理

在 I/O 设备与处理机交换数据时,引入缓冲区,引入缓冲可显著地提高 CPU 和 I/O 设备之间的并行操作程度。可以协调传输数据大小不一致的设备,很好地解决数据粒度不匹配的问题。

5. 用户层的 I/O 软件

5.1 I/O 库函数

操作系统向用户提供的系统调用中包含了供用户读/写文件和设备或控制/检查设备状态的 I/O 系统调用,这些系统调用通常是以库函数的方式提供给用户的。当一个用户程序调用这些库函数时,库函数将与用户程序链接在一起。显然,这些 I/O 库函数也属于 I/O 系统,它们是 I/O 系统用户层 I/O 软件的重要组成部分。

5.2 假脱机(SPOOLing)系统

同时联机外围操作技术。在多道程序环境下,利用多道程序中的一道或两道程序来模拟脱机输入输出中的外围控制机的功能以达到“脱机”输入输出的目的,既在联机的条件下,将数据从输入设备传送到磁盘,或从磁盘传送到输出设备。通过它可以将一台独占的物理设备虚拟为多台逻辑设备,从而该物理设备可以被多个进程同时共享。

  1. SPOOLing 系统的组成。
    a. 输入井和输出井。
    b. 输入缓冲区和输出缓冲区。
    c. 输入进程和输出进程。
    d. 井管理程序。
  2. 假脱机打印系统。

假脱机打印系统并不真正把打印机分配给用户进程,而是由假脱机管理进程为它做两件事:在输出井中为之申请一个空闲的磁盘块区,并将要打印的数据送入其中;为用户进程申请一张空白的用户请求答应表,并将用户的打印要求填入其中,案后将该表挂到假脱机文件队列上。

6. 磁盘调度

6.1 磁盘简述

寻道时间:磁头移动到指定磁道上所经历的时间。占大部分。
旋转延迟时间:扇区移动到磁头下面所经历的时间。
传输时间:数据读写的时间。

6.2 磁盘调度

  1. 先来先服务(FCFS)。容易产生饥饿现象。
  2. 最短寻道时间优先(SSTF)。每次的寻道时间最短并不能保证平均寻道时间最短,容易产生饥饿现象。
  3. 扫描(SCAN)调度算法。电梯调度算法。选中当前磁头移动方向上、距离当前磁头所在的磁道最近的磁道上的请求。具有较好寻到性能,又能防止饥饿现象。
  4. 循环扫描(CSCAN)调度算法。此算法规定只在磁头移动的某一个方向上处理磁盘请求。当沿该方向访问到最远的一个请求后,磁臂立即返回到磁盘的另一端,并再次开始扫描。
  5. N-step-SCAN算法。当进程对某一磁道由较高的访问频率时,利用 SSTF、SCAN及CSCAN算法,都可能出现磁臂停留在该磁道不上不动的情况(磁臂粘着)。引入该算法,将磁盘请求队列按请求到达的先后顺序分成若干个长度为 N 的子队列,并采用 FCFS 算法依次处理这些子队列,而对每个子队列,则又是按 SCAN 算法进行处理。
  6. FSCAN调度算法。它只把磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成队列,由磁盘调度按 SCAN 算法进行处理。在扫描期间到达的所有请求磁盘 I/O 的进程,被放入另一个等待处理的请求队列,这样,所有的新请求都将被推迟到下一次扫描时处理。