文章目录
第六章 I/O 管理
- I/O系统管理的主要对象: I/O 设备和相应的设备控制器。
- 最主要的任务: 完成用户提出的 I/O 请求,提高 I/O 速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段
一、I/O 系统的功能、模型和接口
(1)功能
- 隐藏物理设备的细节
- 与设备的无关性
- 提高处理机和 I/O 设备的利用率
- 对 I/O 设备进行控制
- 确保对设备的正确共享
- 错误处理
(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 设备与控制器之间的接口
-
数据信号线。
- 对输入而言,是由设备发送给设备控制器的数据信号;
- 对输出而言,是由设备控制器所接收的比特流
-
控制信号线。
由设备控制器发送给设备,该信号规定了设备将要执行的操作。
-
状态信号线。
用于传送指示设备的当前状态的信号

(3)设备控制器
设备控制器主要负责控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。其组成包括:
- 设备控制器与处理机的接口
- 设备控制器与设备的接口
- I/O 逻辑

基本功能包括:
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲
- 差错控制
(4)内存映像 I/O
驱动程序将抽象命令转换出一系列具体命令、参数等数据,装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对 I/O 设备的控制,这一工作可用两种方法来完成。
-
利用特定的 I/O 指令
访问内存和访问设备需要两种不同的指令。
-
内存映像 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 有更多的时间去进行数据处理。
-
通道与 CPU 的区别
- 指令类型单一:通道硬件比较简单, 其所能执行的命令,主要局限于与 I/O 操作有关的指令
- 通道没有自己的内存:通道所执行的通道程序是放在内存中的。即,通道与 CPU 共享内存
-
通道的类型
- 字节多路通道
- 数组选择通道
- 数组多路通道
-
采用多通路方式解决“瓶颈”问题
单通路 I/O 系统中,一个通路被占用,会导致多个设备无法使用。

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

三、中断机构和中断处理程序
中断是:
- 多道程序得以实现的基础
- 设备管理的基础
中断处理程序是 I/O 系统中最低的一层,它是整个 I/O 系统的基础。
(1)中断
-
外中断(中断): 来自处理机外部的中断。
- I/O 设备发出的 I/O 中断
- 外部信号中断(例如用户键入 ESC 键)
- 各种定时器引起的时钟中断
- 调试中断
-
内中断(陷入): 在处理机内部产生的中断。
- 地址非法
- 校验错
- 页面失效
- 存取访问控制错
- 算术操作溢出
- 数据格式非法
- 除数为零
- 非法指令
- 用户程序执行特权指令
- 时间片中断
- 从用户态到核心态的切换
-
中断向量表
每种设备配以相应的中断处理程序,而中断服务程序的入口地址称为中断向量。
把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域(一张表)内。
即中断服务程序入口地址表。
中断请求 → 中断号 → 中断处理程序的入口地址 → 转入中断
-
多中断源的处理方式
- 屏蔽(禁止)中断: 不予理睬
- 嵌套中断: 优先级高的中断优先、中断可抢占
(2)中断处理程序
- 测定是否有未响应的中断信号
- 保护被中断进程的 CPU 现场
- 转入相应的设备处理程序
- 中断处理
- 恢复 CPU 现场并退出中断
四、设备驱动(处理)程序
主要任务: 接收上层软件发来的抽象 I/O 要求,把它转换为具体要求后发送给设备控制器,启动设备去执行;反之,它也将由设备控制器发来的信号传送给上层软件。
(1)功能
- 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列
- 检查用户 I/O 请求的合法性
- 发出 I/O 命令
- 及时响应由设备控制器发来的中断请求并处理
(2)特点
- 在请求 I/O 的进程与设备控制器之间的一个通信和转换程序
- 与设备控制器和 I/O 设备的硬件特性紧密相关,对不同类型的设备应配置不同的驱动程序
- 其中一部分必须用汇编语言书写
- 驱动程序应允许可重入,允许被调用完成前再次被调用
(3)启动设备的过程
- 将抽象要求转换为具体要求
- 检查 I/O 请求的合法性
- 读出和检查设备的状态
- 传送必要的参数
- 工作方式的设置
- 启动 I/O 设备
驱动程序发出 I/O 命令后,基本的 I/O 是在设备控制器的控制下进行的。此时驱动程序进程把自己阻塞起来,直至中断到来时才将它唤醒。
(4)I/O 控制方式
原则:尽量减少主机对 I/O 控制的干预
-
程序直接控制
程序使用 while 循环不断询问 I/O 是否完成。
-
采用中断驱动
CPU 启动完 I/O 后处理其他任务,每次传输数据时通过中断告知 CPU。
-
直接存储器访问(DMA)
在 I/O 设备和内存之间开辟直接的数据交换通路,使得数据的传输不经过 CPU 中的寄存器。
- 数据传输的基本单位是数据块
- 数据在设备与内存直接相互传送
- 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的
该方式相当于委托了 DMA 进行 I/O 操作,在所有数据传输完成后才通过中断告知 CPU。
-
通道控制
使用 I/O 通道专门负责处理 I/O。可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
五、与设备无关的 I/O 软件
设备独立性(设备无关性): 应用程序独立于具体使用的物理设备,使用逻辑设备名来请求某类设备,系统在执行时,则使用该类设备的物理设备名
为实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。
(1)基本概念
-
以物理设备名使用设备。
在早期 OS 中,应用程序在使用 I/O 设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。
-
引入了逻辑设备名。
为了实现与设备的无关性,引入了逻辑设备和物理设备两个概念,逻辑设备是抽象的设备名。
-
逻辑设备名称到物理设备名称的转换。
系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能。
(2)与设备无关的软件
实现与设备无关性的软件是 I/O 系统高层软件,其下是设备驱动程序。
- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 设备的分配与回收
- 提供独立于设备的逻辑数据块
(3)设备分配
-
设备分配中的数据结构
- 设备控制表 DCT(为每台设备配置一张)
- 控制器控制表 COCT
- 通道控制表 CHCT
- 系统设备表 SDT
-
设备分配时应考虑的因素
- 设备的固有属性
- 独占设备的分配策略:分配后被独占
- 共享设备的分配策略:可分配给多个进程,需要注意合理调度
- 虚拟设备的分配策略:可分配给多个进程
- 设备分配算法
- FCFS
- 优先级高者优先
- 设备分配中的安全性
- 设备的固有属性
-
独占设备的分配程序
基本的分配步骤:分配设备 → 分配控制器 → 分配通道
改进:
- 增加设备的独立性,使用逻辑设备名请求 I/O,仅当所有设备都忙时,才分配失败
- 考虑多通路情况,查找所有的控制器和通道,才能决定是否将该进程挂起
-
逻辑设备名到物理设备名映射的实现
- 整个系统只设置一张逻辑设备表 LUT
- 每个用户设置一张逻辑设备表 LUT

六、用户层的 I/O 软件
(1)系统调用与库函数
应用程序通过系统调用,间接调用 OS 中的 I/O 过程,对 I/O 设备进行操作。
系统调用是应用程序取得 OS 所有服务的唯一途径。
用户程序通过调用对应的库函数来使用系统调用,这些库函数与系统调用连接在一起。
(2)SPOOLing 技术
通过 SPOOLing 技术可以将一台独占的物理设备虚拟为多台逻辑设备,从而允许多个用户(进程)共享。
在多道程序系统中,利用一道程序来模拟脱机输入时的外围控制机的功能,把低速 I/O 设备上的数据传送到高速磁盘上;再利用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,在主机的直接控制下,实现脱机输入输出功能。此时的外围操作与CPU对数据的处理同时进行。


-
组成部分
-
输入井和输出井
磁盘上开辟的两个大存储空间
-
输入缓冲区和输出缓冲区
内存中开辟的两个缓冲区
-
输入进程 Spi 和输出进程 Spo
内存中的两个进程
-
井管理程序
用于控制作业与磁盘井之间信息的交换
-
-
特点
- 提高了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)缓冲池

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

八、磁盘存储管理
(1)磁盘性能简述
-
数据的组织和格式
- 物理设备可包含多个盘片
- 每个盘片分为 1 个或 2 个盘面
- 盘面上有磁道,存储信息
- 每条磁道从逻辑上分为若干个扇区,包括:
- 标识符字段:标识属于哪个扇区
- 数据字段:存储数据
需要将磁盘低级格式化才可以存储数据,格式化后需要进行分区,使用磁盘前还需要高级格式化。
-
磁盘类型
- 固定头磁盘:每条磁道上都有磁头,装在磁臂中
- 移动头磁盘:每个盘面一个磁头,装在磁臂中,磁头能够移动以寻道

-
磁盘访问时间
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)磁盘调度
-
先来先服务 FCFS
-
最短寻道时间优先 SSTF
- 选择要求访问的磁道与当前磁头所在的磁道距离最近的进程(磁盘请求),使每次的寻道时间最短
- 该算法不能保证平均寻道时间最短
- 可能导致“饥饿”现象

-
扫描(Scan)算法
- 磁头每次只作单方向移动,直到到达边缘磁道为止,然后再作反向移动
- 下一次待访问的磁道只能在此磁头移动的前方,且选择磁头移动距离最近的一个磁盘请求响应
- 又称为“电梯调度算法”
- 消除了饥饿现象
-
循环扫描(CScan)算法
- 磁头只作由内向外的单方向扫描,到达外边缘后,则返回最内侧的磁道重新进行下一轮扫描
- 改进了对于边缘区磁道访问的不公平

-
N-Step-Scan 算法
问题:若有进程对某一磁道有较高的访问频率,则磁臂可能停留在某处不动,垄断了整个磁盘设备,发生“磁臂粘着”现象。
- 将磁盘请求队列分成若干个长度为 N 的子队列
- 按 FCFS 算法依次处理这些子队列
- 处理一个队列时按 SCAN 算法
- 新来的进程不放入当前处理的队列中,而是放入其它队列中
- 对一个队列处理完后,再处理其它队列
-
FSCAN 算法
- N-Step-Scan 算法的简化,相当于 2-Step-Scan 算法
- 一个队列作为正在处理的队列,另一个为等待处理的请求队列