2021-12-06 《计算机操作系统》(第四版)学习笔记:第六章

第六章 I/O 管理

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

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

(1)功能
  1. 隐藏物理设备的细节
  2. 与设备的无关性
  3. 提高处理机和 I/O 设备的利用率
  4. 对 I/O 设备进行控制
  5. 确保对设备的正确共享
  6. 错误处理
(2)I/O 软件的层次结构
(3)I/O 系统中各种模块之间的层次视图
1. I/O 系统的上、下接口

   -   I/O 系统接口

   -   软件 / 硬件(RW / HW)接口

2. I/O 系统

   -   中断处理程序

   -   设备驱动程序

   -   设备独立性软件
(4)I/O 系统接口
分类 特点
块设备接口 - 数据的存取和传输都是以数据块为单位
- 隐藏磁盘的二维结构
- 将抽象命令映射为低层操作
流设备接口 - 速率低、不可寻址、中断 I/O 方式
- get 和 put 操作。采用顺序存取方式
- in-control 指令
- 大多数流设备都属于独占设备,必须采用互斥方式共享
网络设备接口 *

二、I/O 设备和设备控制器

(1)I/O 设备的组成
  • 执行 I/O 操作的机械部分(习惯称为一般的 I/O 设备)
  • 执行控制 I/O 的电子部件组成(称为设备控制器或适配器)
(2)I/O 设备与控制器之间的接口
  1. 数据信号线。

    • 对输入而言,是由设备发送给设备控制器的数据信号;
    • 对输出而言,是由设备控制器所接收的比特流
  2. 控制信号线。

    由设备控制器发送给设备,该信号规定了设备将要执行的操作。

  3. 状态信号线。

    用于传送指示设备的当前状态的信号

(3)设备控制器

​ 设备控制器主要负责控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。其组成包括:

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

​ 基本功能包括:

  • 接收和识别命令
  • 数据交换
  • 标识和报告设备的状态
  • 地址识别
  • 数据缓冲
  • 差错控制
(4)内存映像 I/O

​ 驱动程序将抽象命令转换出一系列具体命令、参数等数据,装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对 I/O 设备的控制,这一工作可用两种方法来完成。

  1. 利用特定的 I/O 指令

    访问内存和访问设备需要两种不同的指令。

  2. 内存映像 I/O

    统一了对内存和对控制器的访问的方法,简化了 I/O 编程。在编址上不再区分内存单元地址和设备控制器地址,都采用 k:

    • 0 ≤ k ≤ n - 1,认为是内存地址
    • k ≥ n,认为是某个控制器的寄存器地址
(5)I/O 通道

​ I/O 通道是一种特殊的处理机。它具有执行 I/O 指令的能力,并通过执行通道(I/O)程序来控制 I/O 操作。

​ 在 CPU 和设备控制器之间增设通道,主要是为了建立独立的 I/O 操作,不仅使得数据的传送能独立于 CPU ,而且也希望有关对 I/O 操作的组织、管理及其结束处理也尽量独立,以保证 CPU 有更多的时间去进行数据处理

  1. 通道与 CPU 的区别

    • 指令类型单一:通道硬件比较简单, 其所能执行的命令,主要局限于与 I/O 操作有关的指令
    • 通道没有自己的内存:通道所执行的通道程序是放在内存中的。即,通道与 CPU 共享内存
  2. 通道的类型

    • 字节多路通道
    • 数组选择通道
    • 数组多路通道
  3. 采用多通路方式解决“瓶颈”问题

    单通路 I/O 系统中,一个通路被占用,会导致多个设备无法使用。

 为此,可以将一个设备连接到多个控制器上,一个控制器又连接到多个通道上,实现多通路来解决问题。

三、中断机构和中断处理程序

​ 中断是:

  • 多道程序得以实现的基础
  • 设备管理的基础

​ 中断处理程序是 I/O 系统中最低的一层,它是整个 I/O 系统的基础。

(1)中断
  1. 外中断(中断): 来自处理机外部的中断。

    • I/O 设备发出的 I/O 中断
    • 外部信号中断(例如用户键入 ESC 键)
    • 各种定时器引起的时钟中断
    • 调试中断
  2. 内中断(陷入): 在处理机内部产生的中断。

    • 地址非法
    • 校验错
    • 页面失效
    • 存取访问控制错
    • 算术操作溢出
    • 数据格式非法
    • 除数为零
    • 非法指令
    • 用户程序执行特权指令
    • 时间片中断
    • 从用户态到核心态的切换
  3. 中断向量表

    每种设备配以相应的中断处理程序,而中断服务程序的入口地址称为中断向量

    把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域(一张表)内。

    中断服务程序入口地址表

    中断请求 → 中断号 → 中断处理程序的入口地址 → 转入中断

在这里插入图片描述

  1. 多中断源的处理方式

    • 屏蔽(禁止)中断: 不予理睬
    • 嵌套中断: 优先级高的中断优先、中断可抢占
(2)中断处理程序
  1. 测定是否有未响应的中断信号
  2. 保护被中断进程的 CPU 现场
  3. 转入相应的设备处理程序
  4. 中断处理
  5. 恢复 CPU 现场并退出中断

四、设备驱动(处理)程序

主要任务: 接收上层软件发来的抽象 I/O 要求,把它转换为具体要求后发送给设备控制器,启动设备去执行;反之,它也将由设备控制器发来的信号传送给上层软件。

(1)功能
  • 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列
  • 检查用户 I/O 请求的合法性
  • 发出 I/O 命令
  • 及时响应由设备控制器发来的中断请求并处理
(2)特点
  • 在请求 I/O 的进程与设备控制器之间的一个通信和转换程序
  • 与设备控制器和 I/O 设备的硬件特性紧密相关,对不同类型的设备应配置不同的驱动程序
  • 其中一部分必须用汇编语言书写
  • 驱动程序应允许可重入,允许被调用完成前再次被调用
(3)启动设备的过程
  1. 将抽象要求转换为具体要求
  2. 检查 I/O 请求的合法性
  3. 读出和检查设备的状态
  4. 传送必要的参数
  5. 工作方式的设置
  6. 启动 I/O 设备

​ 驱动程序发出 I/O 命令后,基本的 I/O 是在设备控制器的控制下进行的。此时驱动程序进程把自己阻塞起来,直至中断到来时才将它唤醒。

(4)I/O 控制方式

​ 原则:尽量减少主机对 I/O 控制的干预

  1. 程序直接控制

    程序使用 while 循环不断询问 I/O 是否完成。

  2. 采用中断驱动

    CPU 启动完 I/O 后处理其他任务,每次传输数据时通过中断告知 CPU。

  3. 直接存储器访问(DMA)

    在 I/O 设备和内存之间开辟直接的数据交换通路,使得数据的传输不经过 CPU 中的寄存器。

    • 数据传输的基本单位是数据块
    • 数据在设备与内存直接相互传送
    • 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的

    该方式相当于委托了 DMA 进行 I/O 操作,在所有数据传输完成后才通过中断告知 CPU。

  4. 通道控制

    使用 I/O 通道专门负责处理 I/O。可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

五、与设备无关的 I/O 软件

设备独立性(设备无关性): 应用程序独立于具体使用的物理设备,使用逻辑设备名来请求某类设备,系统在执行时,则使用该类设备的物理设备名

​ 为实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。

(1)基本概念
  1. 以物理设备名使用设备。

    在早期 OS 中,应用程序在使用 I/O 设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。

  2. 引入了逻辑设备名。

    为了实现与设备的无关性,引入了逻辑设备和物理设备两个概念,逻辑设备是抽象的设备名。

  3. 逻辑设备名称到物理设备名称的转换。

    系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能。

(2)与设备无关的软件

​ 实现与设备无关性的软件是 I/O 系统高层软件,其下是设备驱动程序。

  • 设备驱动程序的统一接口
  • 缓冲管理
  • 差错控制
  • 设备的分配与回收
  • 提供独立于设备的逻辑数据块
(3)设备分配
  1. 设备分配中的数据结构

    • 设备控制表 DCT(为每台设备配置一张)
    • 控制器控制表 COCT
    • 通道控制表 CHCT
    • 系统设备表 SDT
  2. 设备分配时应考虑的因素

    • 设备的固有属性
      • 独占设备的分配策略:分配后被独占
      • 共享设备的分配策略:可分配给多个进程,需要注意合理调度
      • 虚拟设备的分配策略:可分配给多个进程
    • 设备分配算法
      • FCFS
      • 优先级高者优先
    • 设备分配中的安全性
  3. 独占设备的分配程序

    基本的分配步骤:分配设备 → 分配控制器 → 分配通道

    改进:

    • 增加设备的独立性,使用逻辑设备名请求 I/O,仅当所有设备都忙时,才分配失败
    • 考虑多通路情况,查找所有的控制器和通道,才能决定是否将该进程挂起
  4. 逻辑设备名到物理设备名映射的实现

    • 整个系统只设置一张逻辑设备表 LUT
    • 每个用户设置一张逻辑设备表 LUT

六、用户层的 I/O 软件

(1)系统调用与库函数

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

​ 系统调用是应用程序取得 OS 所有服务的唯一途径。

​ 用户程序通过调用对应的库函数来使用系统调用,这些库函数与系统调用连接在一起。

(2)SPOOLing 技术

​ 通过 SPOOLing 技术可以将一台独占的物理设备虚拟为多台逻辑设备,从而允许多个用户(进程)共享。

​ 在多道程序系统中,利用一道程序来模拟脱机输入时的外围控制机的功能,把低速 I/O 设备上的数据传送到高速磁盘上;再利用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,在主机的直接控制下,实现脱机输入输出功能。此时的外围操作与CPU对数据的处理同时进行。

  1. 组成部分

    • 输入井和输出井

      磁盘上开辟的两个大存储空间

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

      内存中开辟的两个缓冲区

    • 输入进程 Spi 和输出进程 Spo

      内存中的两个进程

    • 井管理程序

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

  2. 特点

    • 提高了I/O的速度,缓和了 CPU 与低速 I/O 设备速度不匹配的矛盾
    • 利用高速共享设备,将独占设备改造为共享设备
    • 实现了虚拟设备功能,用户都感到独占了一台设备

七、缓冲区管理

(1)引入缓冲的原因
  • 缓和 CPU 与 I/O 设备间速度不匹配的矛盾
  • 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制
  • 解决数据粒度不匹配的问题
  • 提高 CPU 和 I/O 设备之间的并行性
(2)单缓冲
  • 每当用户进程发出一 I/O 请求时,操作系统便在主存中为之分配一缓冲区
  • 只能单向传输数据
(3)双缓冲

​ 输入时先往第一缓冲区中输入数据,满后再往第二缓冲区中输入数据,此时,OS 可以从第一缓冲区中取走数据。

(4)多缓冲
  • R:空缓冲区
  • G:已有数据的缓冲区
  • C:正在被使用的缓冲区
  • Getbuf 过程
  • Releasebuf 过程
(5)缓冲池
  1. 组成

    • 3 个队列
      • 空缓冲队列 emq
      • 输入队列 inq
      • 输出队列 outq
    • 4 种工作缓冲区
      • 用于收容输入数据的工作缓冲区 hin
      • 用于提取输入数据的工作缓冲区 sin
      • 用于收容输出数据的工作缓冲区 hout
      • 用于提取输出数据的工作缓冲区 sout
  2. Getbuf 和 Putbuf

八、磁盘存储管理

(1)磁盘性能简述
  1. 数据的组织和格式

    • 物理设备可包含多个盘片
    • 每个盘片分为 1 个或 2 个盘面
    • 盘面上有磁道,存储信息
    • 每条磁道从逻辑上分为若干个扇区,包括:
      • 标识符字段:标识属于哪个扇区
      • 数据字段:存储数据

    需要将磁盘低级格式化才可以存储数据,格式化后需要进行分区,使用磁盘前还需要高级格式化。

  2. 磁盘类型

    • 固定头磁盘:每条磁道上都有磁头,装在磁臂中
    • 移动头磁盘:每个盘面一个磁头,装在磁臂中,磁头能够移动以寻道
  1. 磁盘访问时间
    T a = T s + 1 2 r + b r N T_{a}=T_{s}+{1\over2r}+{b\over rN} Ta=Ts+2r1+rNb
    读写数据的流程:

    • 磁头移动到指定磁道上
    • 等待扇区旋转到磁头下方
    • 开始读写数据

    1)寻道时间 Ts

    移动到指定磁道上所经历的时间,包含启动磁臂时间 s 和磁头移动 n 条磁道所花费的时间。
    T s = m × n + s T_{s}=m\times n+s Ts=m×n+s

    • m:常数,与磁盘驱动器有关

    2)旋转延迟时间 Tr

    指定扇区移动到磁头下面所经历的时间。与盘面的旋转速度有关。

    平均旋转延迟时间为:
    T r = 1 2 r T_{r}={1\over 2r} Tr=2r1

    • r:磁盘每秒钟的转数

    3)传输时间 Tt

    把数据从磁盘读出或向磁盘写入数据所经历的时间。与旋转速度 r 和一次读写的数据量 b 有关。
    T t = b r N T_{t}={b\over rN} Tt=rNb
    b:每次读写的字节数

    N:一条磁道上的字节数

(2)磁盘调度
  1. 先来先服务 FCFS

  2. 最短寻道时间优先 SSTF

    • 选择要求访问的磁道与当前磁头所在的磁道距离最近的进程(磁盘请求),使每次的寻道时间最短
    • 该算法不能保证平均寻道时间最短
    • 可能导致“饥饿”现象
  1. 扫描(Scan)算法

    • 磁头每次只作单方向移动,直到到达边缘磁道为止,然后再作反向移动
    • 下一次待访问的磁道只能在此磁头移动的前方,且选择磁头移动距离最近的一个磁盘请求响应
    • 又称为“电梯调度算法”
    • 消除了饥饿现象
  2. 循环扫描(CScan)算法

    • 磁头只作由内向外的单方向扫描,到达外边缘后,则返回最内侧的磁道重新进行下一轮扫描
    • 改进了对于边缘区磁道访问的不公平
  1. N-Step-Scan 算法

    问题:若有进程对某一磁道有较高的访问频率,则磁臂可能停留在某处不动,垄断了整个磁盘设备,发生“磁臂粘着”现象。

    • 将磁盘请求队列分成若干个长度为 N 的子队列
    • 按 FCFS 算法依次处理这些子队列
    • 处理一个队列时按 SCAN 算法
    • 新来的进程不放入当前处理的队列中,而是放入其它队列中
    • 对一个队列处理完后,再处理其它队列
  2. FSCAN 算法

    • N-Step-Scan 算法的简化,相当于 2-Step-Scan 算法
    • 一个队列作为正在处理的队列,另一个为等待处理的请求队列

猜你喜欢

转载自blog.csdn.net/zheliku/article/details/122974491