第六章 输入输出系统
一、I/O 系统的功能、模型和接口
1.1 I/O 系统的基本功能
第一二方面是为了方便用户使用
第三四方面是提高 CPU 和 I/O 设备利用率
第五六方面是为用户在共享设备时提供方便,以保证系统有条不紊运行,发生错误是能及时发现甚至自动修正
1. 隐藏物理设备的细节
通过对设备加以适当的抽象,以隐藏掉物理设备的实现细节,仅向上层提供少量的,抽象的读/写命令
2. 与设备的无关性
用户不仅可以使用抽象的 I/O 命令,还可以使用抽象的逻辑设备名来使用设备
有效提高 OS 的可移植性和易适应性
3. 提高处理机和 I/O 设备的利用率
尽可能让处理机和 I/O 设备并行操作,以提高它们的利用率
一方面要求处理机能快速响应用户的 I/O 请求,使 I/O 设备尽快运行起来
另一方面减少在每个 I/O 设备运行时处理机的干预时间
4. 对 I/O 设备进行控制
目前的四种控制方式
- 采用轮询的可编程 I/O 方式
- 采用中断的可编程 I/O 方式
- 直接存储器访问
- I/O 通道
5. 确保对设备的正确设备
系统中的设备可分为两类
- 独占设备,进程应互斥地访问这类设备。如打印机,磁带机
- 共享设备,一段时间内允许多个进程同时访问。如磁盘
6. 错误处理
临时性错误:重试操作
持久性错误:向上层报告
1.2 I/O 系统的层次结构和模型
1. I/O 软件的层次结构
- 用户层 I/O 软件,实现与用户交互的接口
- 设备独立性软件,用于实现用户程序与设备驱动器的统一接口、设备命名、设备保护以及设备的分配和释放等
- 设备驱动程序,与设备直接相关,用于具体实现系统对设备发出的操作指令
- 中断处理程序,用于保存被中断进程的 CPU 环境,转入相应的中断处理程序进行处理
2. I/O 系统中各种模块之间的层次试图
I/O 系统的上下接口
I/O 系统接口:是 I/O 系统与上层系统之间的接口,向上层提供对设备进行操作的抽象 I/O 命令,以方便高层对设备的使用
上层系统有文件系统、虚拟存储器系统以及用户进程等
软件/硬件接口:下面一个接口是软件/硬件接口,它的上面是中断处理程序和用于不同设备的设备驱动程序,它下面是各种设备的控制器
I/O 系统的分层
I/O 系统本身分为三个层次
- 中断处理程序
- 设备驱动程序
- 设备独立性软件
1.3 I/O 设备接口
1. 块设备接口
- 块设备:数据的存取与传输以数据块为单位,例如磁盘。基本特征是传输速率高,可寻址。磁盘 I/O 常用 DMA 方式
- 隐藏了磁盘的二维结构
- 将抽象命令映射为低层操作
2. 流设备接口
- 字符设备:数据的存取与传输以字符为单位,如键盘、打印机。基本特征是传输速率低,不可寻址。常采用中断驱动方式
- get 和 put 操作:只能采取顺序存取方式。通常是建立一个字符缓冲区(队列),获取或输出字符的方式是采用 get 和 put 操作
- in-control 指令:通常提供一种通用的指令,包含许多参数,表示一个与具体设备相关的特定功能
3. 网络通信接口
二、I/O 设备和设备控制器
2.1 I/O 设备
1. I/O 设备的类型
- 按使用特性分类
- 存储设备:用以存储信息
- I/O 设备
- 输入设备:键盘、鼠标、扫描仪、摄像头
- 输出设备:打印机、绘图仪
- 交互式设备:显示器
- 按传输速率分类
- 低速设备:键盘、鼠标
- 中速设备:行式打印机、激光打印机
- 高速设备:磁带机、磁盘机、光盘机
2. 设备与控制器的接口
设备不直接与 CPU 通信,而是与设备控制器通信,在 I/O 设备与设备控制器的接口中通常有三种类型的信号,对应三条信号线
- 数据信号线
- 控制信号线
- 状态信号线
2.2 设备控制器
1. 设备控制器的基本功能
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲区
- 差错控制
2. 设备控制器的组成
- 设备控制器与处理机调度接口
- 设备控制器与设备的接口
- I/O 逻辑
2.3 内存映像 I/O
1. 利用特定的 I/O 指令
1 | Store cpu-reg,k |
2. 内存映像 I/O
不再区分内存单元地址和设备控制器的寄存器地址
1 | Store cpu-reg,k |
2.4 I/O 通道
1. I/O 通道的引入
I/O 通道是特殊的处理机,具有执行 I/O 指令的能力,并通过执行通道程序控制 I/O 操作,与一般处理的区别是
- 指令类型单一
- 通道没有自己的内存,与 CPU 共享
2. 通道类型
- 字节多路通道
- 数组选择通道
- 数组多路通道
3. “瓶颈”问题
增加设备到主机间的通路而不增加通道,即把一个设备连接到多个控制器上,一个控制器连接到多个通道上
不仅解决了瓶颈问题,还提高了系统可靠性
三、中断机构和中断处理程序
见计组
四、设备驱动程序
4.1 设备驱动程序概述
1. 设备驱动程序的功能
- 接收与设备无关的软件发来的命令和参数,将命令中的抽象要求转换为与设备相关的底层操作序列
- 检查用户 I/O 请求的合法性,了解 I/O 设备工作状态,传递 I/O 设备操作有关参数,设置设备工作方式
- 发出 I/O 命令
- 及时响应设备控制器传来的中断请求
2. 设备驱动程序的特点
- 驱动程序是实现在设备无关的软件和设备控制器之间通信和转换的程序,
- 驱动程序与设备控制器以及 I/O 设备的硬件特性紧密相关
- 驱动程序与 I/O 设备采用的控制方式紧密相关
- 由于驱动程序与硬件紧密相关,其中一部分必须用汇编语言书写。很多驱动程序已经固化在 ROM 中
- 驱动程序应允许重写入
3. 设备处理方式
- 每一类设备设置一个进程:适用于比较大的系统
- 整个系统中设置一个 I/O 进程;也可以设置一个输入进程一个输出进程
- 不设置专门的设备处理进程,只为各类设备设置相应的设备驱动程式,供系统用户进程调用
4.2 设备驱动程序的处理过程
- 抽象要求转为具体要求
- 对服务请求校验
- 检查设备状态
- 传递比快参数
- 启动 I/O 设备
多道程序系统中,驱动程序一旦发出一个 I/O 命令,启动了一个 I/O 操作后,驱动程序便把控制返回给 I/O 系统,阻塞自己直到中断到来。具体的 I/O 操作在设备控制器的控制下进行,所以设备忙于传送数据时,处理机可以干其他事,实现了处理机与 I/O 设备的并行操作
4.3 对 I/O 设备的控制方式
1. 轮询
2. 中断
3. DMA
4. 通道
五、与设备无关的 I/O 软件
设备独立性/设备无关性:应用程序中所用的设备,不局限于使用某个具体的物理设备
为实现设备独立性,必须在设备驱动程序之上设置一层软件,称为与设备无关的 I/O 软件,或设备独立性软件
5.1 与设备无关软件的基本概念
1. 以物理设备名使用设备
2. 引入了逻辑设备名
可实现 I/O 重定向
3. 逻辑设备名称到物理设备名称的转换
系统中必须具有将逻辑设备名称转换为某物理设备名称的功能
5.2 与设备无关的软件
1. 设备驱动程序的统一接口
要求每个设备驱动程序与 OS 只有有相同或相近的接口
要将抽象的设备名映射到具体的驱动程序上
对设备进行保护,禁止无权访问
2. 缓冲管理
单缓、多缓、等
3. 差错控制
4. 对独立设备的分配与回收
5. 提供独立于设备的块大小
5.3 设备分配
1. 设备分配中的数据结构
- 设备控制表 DCT
- 控制器控制表、通道控制表、系统设备表
2. 设备分配时考虑的因素
- 设备的固有属性
- 独占设备的分配策略
- 共享设备的分配策略
- 虚拟设备的分配策略
- 设备分配算法
- 先来先服务
- 优先级高者先
- 设备分配中的安全性
3. 独占设备的分配程序
5.4 逻辑设备名到物理设备名映射的实现
1. 逻辑设备表 LUT
2. 逻辑设备表的涉笔问题
- 整个系统一张:单用户系统
- 每个用户一张
六、用户层的 I/O 软件
6.1 系统调用与库函数
1. 系统调用
当应用程序需要执行某种 I/O 操作时,在应用程序中使用相应的系统调用。当 OS 捕获到系统调用后,将 CPU 从用户态切换为核心态,转向操作系统中相应过程,由该过程完成所需 I/O 操作。执行完毕后 CPU 从核心态转为用户态,返回应用程序继续执行
2. 库函数
C 语言中有对文件和设备进行访问的库函数,检查设备状态的库函数等
6.2 假脱机(Spooling)系统
1. 假脱机技术
外围操作与 CPU 对数据的操作同时进行,这种在联机情况下实现的同时外围操作的技术称为 SPOOLing 技术
2. SPOOLing 的组成
SPOOLing 系统建立在通道技术和多道程序技术的基础上,以高速随机外存(磁盘)为后援存储器
- 输入井与输出井
- 输入缓冲区和输出缓冲区
- 输入进程和输出进程
- 井管理程序
3. SPOOLing 系统的特点
- 提高了 I/O 速度
- 将独占设备改为共享设备
- 实现了虚拟设备功能
4. 假脱机打印机系统
5. 守护进程
守护进程是允许使用该独占设备的唯一进城,所有其他进程不能直接使用该设备,而是将对该设备的使用要求写入一份文件中,放在假脱机目录。由守护进程按照目录中的文件依次完成诸设备的请求
七、缓冲区管理
7.1 缓冲的引入
- 缓和 CPU 和 I/O 设备间速度不匹配的矛盾
- 降低对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制
- 解决数据粒度不匹配的问题
- 提高 CPU 和 I/O 设备的并行性
7.2 单缓冲区与双缓冲区
1. 单缓冲区
2. 双缓冲区
由于缓冲区是共享资源,生产者和消费者使用时必须互斥
如果为生产者和消费者设置两个缓冲区便能解决这一问题
在实现两台机器之间的通信时单缓冲只能实现任一时刻单方面的数据传输。双向缓冲区可以一个用作发送缓冲区一个用作接收缓冲区
7.3 环形缓冲区
略
7.4 缓冲池
缓冲区仅仅是一组内存块的链表,而缓冲池则是包含了一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区
八、磁盘存储器的性能和调度
8.1 磁盘性能简述
1. 数据的组织和格式
磁盘上能存储的物理记录块数目是由扇区数、磁道数和磁盘面数决定的
双面可存储盘片
存储面(盘面)
磁道(柱面)
2. 磁盘的类型
- 固定头磁盘:可并行读写,有效提高 I/O 速度,用于大容量磁盘
- 移动头磁盘:仅能串行方式读写,中小型磁盘
3. 磁盘访问时间
寻道时间
:把磁臂(磁头)移动到指定磁道上所经历的时间,由启动磁臂的时间 与磁头移动 条磁道所花费的时间之和,即 其中 是常数,与磁盘驱动器的速度有关,一般 ,高速磁盘 ,磁盘的启动时间 约为 ,一般来说寻道时间为 旋转延迟时间
:指定扇区移动到磁头下面所经历的时间,不同磁盘速度相差很大 对于硬盘转速
,则每转需 ,平均旋转延迟时间 传输时间
:把数据从磁盘读出想磁盘写入数据所经历的时间,与每次读写的字节数 和旋转速度有关 其中 为每秒转数; 为一条磁道上的字节数,当一次读写的字节数相当于半条磁道上的字节数时, ,因此访问时间 可表示为
8.2 早期的磁盘调度算法
1. 先来先服务(FCFS)
2. 最短寻道时间优先(SSTF)
每次找最近的
8.3 基于扫描的磁盘调度算法
1. 扫描(SCAN)算法
又称电梯调度算法,自里向外时只找外面的最近的,到了最外面再向里扫描
性能良好,防止饥饿
2. 循环扫描(CSCAN)算法
规定磁头单向移动,例如只是从里向外移动,移到最外的磁道并访问后,磁头立即返回最里的欲访问磁道
3. NStepSCAN 和 FSCAN 调度算法
NStepSCAN 算法
防止某些进程反复请求都某一磁道的 I/O 操作垄断整个磁盘设备的“磁盘黏着”操作
将请求队列分为若干个长度为
的子队列,按 FCFS 算法依次处理子队列,队列内按 SCAN 算法 FSCAN 算法
是 NStepSCAN 算法的简化,将请求队列分给两个队列
一个是当前所有请求磁盘 I/O 的进程的队列,由 SCAN 算法处理
另一个是扫描期间新出现的所有请求磁盘 I/O 的进程的等待处理的队列,即推迟到下一次扫描时处理