操作系统 第六章输入输出系统

6.1 I/O 系统的功能、模型和接口

6.1.1 I/O 系统的基本功能

  1. 隐藏物理设备的细节

  2. 与设备的无关性

    一方面用抽象的 I/O 命令,抽象的逻辑设备名来使用设备;另一方面提高 OS 的可移植性和易适应性。
  3. 提高处理机和 I/O 设备的利用率

    尽可能并行操作,一方面快速响应 I/O 请求,另一方面减少在每个 I/O 设备运行时的干预时间。

  4. 对 I/O 设备进行控制

    四种控制方式:① 采用轮询的可编程 I/O 方式;② 采用中断的可编程 I/O 方式;③ 直接存储器访问方式;④ I/O 通道方式。

  5. 确保对设备的正确共享

    独占设备:进程应互斥地访问这类设,打印机、磁带机等;

    共享设备:在一段时间内允许多个进程同时访问的设备,磁盘等。

  6. 错误处理

    对于临时性错误,可通过重试操作来纠正,只有在发生了持久性错误时,才需要向上层报告。

6.1.2 I/O 系统的层次结构和模型

  1. I/O 软件的层次结构

  2. I/O 系统中各种模块之间的层次视图

    1. I/O 系统的上、下接口

    2. I/O 系统的分层

      中断处理程序、设备驱动程序、设备独立性软件。

6.1.3 I/O 系统接口

  1. 块设备接口

    • 块设备:数据存取和传输都是以数据块为单位的设备。

    • 隐藏了磁盘的二维结构:将磁盘上的所有扇区编号成一种线性序列。

    • 将抽象命令映射为低层操作:块设备接口支持上层的抽象命令,将其映射为低层操作。

  2. 流设备接口

    • 字符设备:数据的存取和传输是以字符为单位的设备。传输效率低,不可寻址。
    • get 和 put 操作:顺序存取。get 得到字符到内存,put 输出到字符缓冲区。
    • in-control 指令:通用指令,包含许多参数。
  3. 网络通信接口

6.2 I/O 设备和设备控制器

6.2.1 I/O 设备

  1. I/O 设备的类型

    • 使用特性分类:存储设备、I/O 设备(输入、输出、交互设备)。
    • 传输速率:低速(键盘鼠标)、中速(打印机)、高速(磁带机)。
    • 资源分配:独占设备、共享设备、虚拟设备。
    • 信息交换:块设备、字符设备。
  2. 设备与控制器之间的接口

    数据信号

    • 输入:设备->控制器

    • 输出:控制器->设备

    控制信号:读、写或执行等操作信号 状态信号:指示设备的当前状态

6.2.2 设备控制器

  1. 设备控制器的基本功能

    • 接受和识别命令
    • 数据交换
    • 标识和报告设备的状态
    • 地址识别
    • 数据缓冲区
    • 差错控制
  2. 设备控制器的组成

    • 设备控制器与处理机的接口
    • 设备控制器与设备的接口
    • I/O 逻辑

6.2.3 内存映像 I/O

6.2.4 I/O 通道

  1. I/O 通道设备的引入

    由专用的 I/O 处理机来接受 CPU 的委托,独立执行自己的通道程序来实现 I/O 设备与内存之间的信息交换,这就是通道技术。

  2. 通道类型

    • 字节多路通道:在这种通道中,通常都含有较多个非分配型子通道,每一个子通道连接一台 I/O 设备。这些子通道按时间片轮转方式共享主通道。
    • 数组选择通道:这种通道虽然可以连接多台 I/O 设备,但是它只有一个分配型子通道,在一段时间内只能执行一道通道程序、控制一台设备进行数据传送,其数据传送是按数组方式进行。
    • 数组多路通道:数组多路通道是将数组选择通道的传输速率高和字节多路通道的分时并行操作的优点结合起来,形成的一种新的通道。
  3. ”瓶颈“问题

    通道贵->通道少。增加通路。

6.3 中断机构和中断处理程序

6.3.1 中断简介

  1. 中断陷入

    • 中断:外中断,CPU 对 I/O 设备的中断信号的响应
    • 陷入:内中断,CPU 内部时间引起的中断,如运算上溢下溢,程序出错等
  2. 中断向量表和中断优先级

    • 中断向量表:将中断处理程序的入口地址放在中断向量表的一个表项中。为中断请求规定一个中断号,直接对应中断向量表的一个表项。
    • 中断优先级:为每个中断请求分配优先级。
  3. 对多中断源的处理方式

    • 屏蔽(禁止)中断

      只处理一个中断,屏蔽其他中断,直到本次中断处理完成。

    • 嵌套中断

      CPU 优先响应最高优先级的中断请求,高优先级的中断请求可以抢占正在运行的低优先级中断的处理机。

6.3.2 中断处理程序

处理过程:

  1. 测定是否有未响应的中断信号。
  2. 保护被中断进程的 CPU 环境。
  3. 转入相应的设备处理程序。
  4. 中断处理。
  5. 恢复 CPU 的现场并退出中断。若采用了屏蔽中断的方式,返回被中断的进程。采用中断嵌套方式,若没有优先级更高的中断请求 I/O,中断完成后,仍返回被中断进程;反之,系统将处理优先级更高的中断请求。

6.4 设备驱动程序

6.4.1 设备驱动程序概述

  1. 设备驱动程序的功能
    • 接收上层软件发来的抽象要求(如read命令等),再把它转换成具体要求。
    • 检查用户 I/O 请求的合法性,了解 I/O 设备的状态,设置工作方式。
    • 由驱动程序向设备控制器发出 I/O 命令,启动分配到的 I/O 设备,完成指定的 I/O 操作。
    • 及时响应由控制器或通道发来的中断请求,并根据其中断调用相应的中断处理程序进行处理。
    • 对于设置有通道的计算机系统,驱动程序还应能够根据用户的 I/O 请求,自动地构成通道程序。
  2. 设备驱动程序的特点
    • 是一个请求 I/O 进程与设备控制器之间的一个通信程序。
    • 驱动程序与设备控制器以及 I/O 设备的特性紧密相关。
    • 驱动程序与 I/O 控制方式紧密相关。
    • 驱动程序与硬件紧密相关。
    • 驱动程序应允许可重入。
  3. 设备处理方式
    • 为每一类设备设置一个 I/O 进程
    • 整个系统中设置一个 I/O 进程
    • 不设置专门的设备处理进程

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

  1. 将抽象要求转换成为具体要求
  2. 检查 I/O 请求的合理性。
  3. 读出和检查设备的状态,确保设备处于就绪态。
  4. 传送必要的参数,如传送的字节数,数据在主存的首址等。
  5. 启动 I/O 设备,并检查启动是否成功,如成功则将控制返回给 I/O 控制系统,在 I/O 设备忙于传送数据时,该用户进程把自己阻塞,直至中断到来才将它唤醒,而 CPU 可干别的事。

6.4.3 对 I/O 设备的控制方式(记)

  1. 使用轮询的可编程 I/O 控制方式(程序 I/O 方式)

    早期,CPU 浪费。

  2. 使用中断的可编程 I/O 控制方式(中断方式)

    广泛。当某进程要启动某个 I/O 设备时,便由 CPU 向相应的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。设备控制器便按照该命令的要求去控制 I/O 设备。此时, CPU 与 I/O 设备处于并行工作状态。

  3. 直接存储器访问 DMA 控制方式

    特点是:

    • 数据传输的基本单位是数据块。

    • 内存与设备之间的直接数据传送,而不用 CPU 的干预。

    • 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的。

  4. I/O 通道控制方式

    通道是通过执行通道程序并与设备控制器共同实现对 I/O 设备的控制的。通道程序是由一系列通道指令(或称为通道命令)所构成的。

6.5 与设备无关的 I/O 软件

为了方便用户和提高 OS 的可适应性与可扩展性,在现代 OS 的 I/O 系统中,都无一例外地增加了与设备无关的 I/O 软件,以实现设备独立性,也称为设备无关性。

6.5.1 与设备无关软件的基本概念

  1. 以物理设备名使用设备
  2. 引入了逻辑设备名
  3. 逻辑设备名称到物理设备名称的转换

6.5.2 与设备无关的软件

  1. 设备驱动程序的统一接口
  2. 缓冲管理
  3. 差错管理:暂时性错误、持久性错误
  4. 对独立设备的分配与回收
  5. 独立于设备的逻辑数据块

6.5.3 设备分配

  1. 设备分配中的数据结构

    • 设备控制表

    • 控制器控制表、通道控制表和系统设备表

  2. 设备分配时应考虑的因素

    • 设备的固有属性
      • 独占设备:将一个设备分配给某进程后,便一直由它独占,直至该进程完成或释放该设备为止。
      • 共享设备:将共享设备同时分配给多个进程使用。
      • 虚拟设备:属于可共享的设备,将共享设备同时分配给多个进程使用。
    • 设备分配算法
      • 先来先服务
      • 优先级高者优先
    • 设备分配中的安全性
      • 安全分配方式:每当进程发出 I/O 请求,便阻塞,直到 I/O 完成。
      • 不安全分配方式:进程发出 I/O 请求后仍运行,可能具备“请求和保持”条件而死锁。
  3. 独占设备的分配程序

    • 基本的设备分配程序

      • 分配设备
      • 分配控制器
      • 分配通道
    • 设备分配程序的改进

      使用逻辑设备名请求 I/O。

6.5.4 逻辑设备名到物理设备名映射的实现

设备独立性:用户程序不直接使用物理设备名(或设备的物理地址),而只能使用逻辑设备名;而系统在实际执行时,将逻辑设备名转换为某个具体的物理设备名,实施 I/O 操作。

  1. 逻辑设备表 LUT(Logical Unit Table)

  2. 逻辑设备表的设置问题

    • 整个系统中设置一张 LUT,不允许相同的逻辑设备名。
    • 每个用户设置一张 LUT。

6.6 用户层的 I/O 软件

6.6.1 系统调用与库函数

  1. 系统调用

    应用程序可以通过它间接调用 OS 中的 I/O 过程,对 I/O 设备进行操作。

  2. 库函数

6.6.2 假脱机(Spooling)系统

  1. 假脱机技术

    利用一道程序,来模拟脱机输入时的外围控制机的功能,即把低速 I/O 设备上的数据传送到高速的磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,即把数据从磁盘传送到低速 I/O 设备上。这样,便在主机的直接控制下,实现脱机输入、输出功能。

    在联机情况下实现的同时与外围设备联机操作的技术称为 SPOOLing(Simultaneous Peripheral Operation On Line),或称为假脱机技术。

  2. SPOOLing 的组成

    • 输入井和输出井

      存储区域。输入井模拟脱机输入时的磁盘,收容 I/O 设备输入的数据;输出井模拟脱机输出时的磁盘,收容用户程序的输出数据;数据以文件的形式组织管理,称为“井文件”。

    • 输入缓冲区和输出缓冲区

      缓冲区。缓和 CPU 和磁盘之间速度不匹配的矛盾。

    • 输入进程和输出进程

      (预)输入进程,模拟脱机输入时的外围控制机,(缓)输出进程模拟脱机输出时的外围控制机。

    • 井管理程序

      控制作业与磁盘井之间信息的交换

  3. SPOOLing 系统的特点

    提高 I/O 的速度;将独占设备改造为共享设备;实现了虚拟设备功能。

  4. 假脱机打印机系统

  5. 守护进程

    需要将独占设备改造成共享设备时,都要为该设备配置一个守护进程和一个假脱机文件队列(目录)。守护进程时允许使用该独占设备的唯一进程,其他进程都不能直接使用该设备。

6.7 缓冲区管理

6.7.1 缓冲的引入

  • 改善 CPU 与 I/O 设备间速度不匹配的矛盾
  • 可以减少对 CPU 的中断频率,放宽对中断响应时间的限制
  • 提高 CPU 和 I/O 设备之间的并行性

6.7.2 单缓冲区和双缓冲区

  1. 单缓冲区

    每当一个用户进程发出一个 I/O 请求时,OS 在主存中为之分配一个缓冲区。磁盘把一块数据输入到缓冲区的时间为 T,OS 将该缓冲区中的数据传送到用户区的时间为 M,CPU 对这一块数据处理的时间为 C,T 和 C 可以并行。系统对每一块数据的处理时间为 \(Max(C,T)+M\)

  2. 双缓冲区

    加快输入和输出速度,提高设备利用率。又称“缓冲对换”。输入时,先将数据送入第一缓冲区,装满后转向第二缓冲区。此时 OS 可从第一缓冲区移出数据,送入用户进程。处理时间近似为 \(MAX(C+M,T)\)

6.7.3 环形缓冲区

若输入与输出速度基本相匹配,采用双缓冲效果好。

  1. 环形缓冲区的组成

    • 多个缓冲区:装入数据的空缓冲区 R,装满数据的缓冲区 G,计算进程正在使用的现行工作缓冲区 C。
    • 多个指针:指示计算进程下一个可用缓冲区 G 的指针 Nextg,指示输入进程下次可用的空缓冲区 R 的指针 Nexti,以及用于指示计算进程正在使用的缓冲区 C 的指针 Current。

  2. 环形缓冲区的使用

    • Getbuf 过程

      计算进程要使用缓冲区中数据时使用。将指针 Nextg 所指示的缓冲区提供给进程使用,并改为工作缓冲区,Current 指针指向该缓冲区的第一个单元,Nextg 移向下一个 G 缓冲区。如果要使用空缓冲区,Nextg 移向下一个 R 缓冲区。

    • Releasebuf 过程

      计算进程把 C 缓冲区中的数据提取完毕时使用。释放 C 缓冲区,把当前工作缓冲区 C 改为空缓冲区 R。当输入进程把缓冲区装满时,也应调用 ReleaseBuf 过程,释放该缓冲区,改为 G 缓冲区。

  3. 进程之间的同步问题

    • Nexti 指针追赶上 Nextg 指针。即输入进程输入速度大于计算进程处理速度。此时,输入进程应阻塞直到计算进程处理完。即系统受计算限制。
    • Nextg 指针追赶上 Nexti 指针。即输入进程输入速度小于计算进程处理速度。计算进程智能阻塞,直至装入数据。即系统受 I/O 限制。

6.7.4 缓冲池

  1. 缓冲池的组成

    • 空白缓冲队列 emq,空缓冲区所链成的队列。
    • 输入队列 inq,装满输入数据的缓冲区所链成的队列。
    • 输出队列 outq,装满输出数据的缓冲区所链成的队列。
    • 收容输入数据的工作缓冲区,提取输入数据的工作缓冲区,收容输出数据的工作缓冲区,提取输出数据的工作缓冲区。
  2. Getbuf 过程和 Putbuf 过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Getbuf(unsigned type) {
    Wait(RS(type));
    Wait(MS(type));
    B(number) = Takebuf(type);
    Signal(MS(type));
    }

    void Putbuf(type, number) {
    Wait(MS(type));
    Addbuf(type, number);
    Signal(MS(type));
    Signal(RS(type));
    }
  3. 缓冲区的工作方式

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×