第六章 输入输出系统
6.1 I/O系统的功能,模型,和接口
基本功能
- 隐藏物理设备的细节
- 与设备的无关性
- 提高处理机和I/O设备的利用率
- 对I/O设备进行控制
- 确保对设备的正确共享
- 错误处理
层次结构
I/O系统接口
- 块设备接口
- 块设备
- 隐藏了磁盘的二维结构
- 将抽象命令映射为低层操作
- 流设备接口
- 字符设备
- get和put操作
- in-control指令
- 网络通信接口
6.2 I/O设备和设备控制器
I/O设备
- 类型
- 按使用特性分类
- 存储设备,I/O设备
- 按传输速率分类
- 高速,中速,低速
- 按使用特性分类
- 设备与控制器的接口
设备控制器
- 基本功能
- 接收和识别命令
- 数据交换
- 标识和报告设备状态
- 地址识别
- 数据缓冲区
- 差错控制
- 组成
- 设备控制器和处理机的接口
- 设备控制器和设备的接口
- I/O逻辑
内存映像I/O
对I/O设备的控制可用以下两种方法
- 利用特定的I/O指令
- cpu-reg:CPU的某个寄存器
- dev-no:控制器地址
- dev-reg:指定控制器中的寄存器
- 缺点:访问内存和访问设备用两种不同指令
- 内存映像I/O
- 优点:统一了对内存和对控制器的访问方法
I/O通道
-
目的:建立独立的I/O操作,使原来由CPU处理的I/O任务转由通道承担
-
I/O通道是特殊的处理机,指令类型单一,没有自己的内存,与CPU共享内存
-
通道类型
-
字节多路通道
- 每个子通道完成一个字节的交换后把主通道让给下个子通道
-
数组选择通道
-
数组多路通道
-
-
瓶颈问题
-
价格昂贵导致通道数量少,通道不足导致瓶颈问题
- 如想要启动设备4,需要通道1和控制器2,但如果通道1被占用则无法启动
-
解决办法:增加设备到主机的通路而不增加通道
-
6.3 中断机构和中断处理程序
中断
- 中断分类
- 中断
- 中断是指CPU对I/O设备发来的中断信号的一种响应
- CPU暂停正在执行的程序,保留CPU环境后,自动转去执行I/O设备的中断处理程序
- 执行完再回到断点,继续执行程序
- 陷入
- 由CPU内部事件所引起的中断,这类中断称为内中断或陷入
- 如运算上下溢,程序出错,电源故障
- 中断
- 中断向量表
- 每种设备配相应中断处理程序,并把该程序入口地址放在中断向量表的一个表项中
- 为每个设备的中断请求规定一个中断号,对应中断向量表中的表项
- 中断优先级
- 对多中断源的处理方式
- 屏蔽中断
- 处理机在处理中断时,屏蔽所有其他中断,让它们等待
- 嵌套中断
- 优先响应最高优先级的中断请求
- 高优先级的中断请求可以抢占正在运行的低优先级中断的处理机
- 屏蔽中断
中断处理程序
处理过程
-
测定是否由未响应的中断信号
-
保护被中断进程的CPU环境
-
转入相应的设备处理程序
-
中断处理
-
恢复CPU现场并退出中断
6.4 设备驱动程序
概述
主要任务:接收上层软件发来的抽象I/O要求,转为具体要求发送给设备控制器,启动设备区执行,反之将设备控制器发来的信号传送给上层软件
功能
- 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列
- 检查用户I/O请求的合法性,了解I/O设备的工作状态,传递参数和设置设备工作方式
- 发出I/O命令
- 及时响应由设备控制器发来的中断请求
设备处理方式
- 为每一类设备设置一个进程,专门用于执行这类设备的I/O操作
- 在整个系统中设置一个I/O进程,辅助执行系统中各类设备的I/O操作
- 只为设备设置相应的设备驱动程序
处理过程
-
将抽象要求转换为具体要求
-
对服务请求进行校验
-
检查设备状态
-
传递必要参数
-
启动I/O设备
对I/O设备的控制方式
- 使用轮询的可编程I/O方式
- 启动输入设备输入数据时,要同时把昨天寄存器中的忙/闲标志busy置为1
- 然后不断地循环测试busy(轮询)
- busy=1时,表示输入及尚未输完一个字(符),继续测试
- busy=0时,表示输入机已将输入数据送人控制器的数据寄存器中,于是处理机将数据寄存器中的数据取出,送入内存指定单元中,完成了一个字(符)的I/O
- 再去启动读下一个数据
- 使用中断的可编程I/O方式
- 直接存储器访问方式
- 上面两种方式都是以字(节)为单位进行I/O,用于块设备极其低效
- 按存储器访问方式的引入
- 该方式数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次至少传送一个数据块
- 所传送数据从设备之间送入内存
- 仅在传送一个或多个数据块的开始和结束时才需要CPU干预
- DMA控制器的组成
- 主机,DMA控制器的接口,DMA控制器与块设备的接口,I/O控制逻辑
- 命令/状态寄存器CR,内存地址寄存器MAR,数据寄存器DR,数据计数器DC
- I/O通道控制方式
- DMA方式的发展,把对一个数据块的读或些为单位的干预,减少为对一组数据块的读或写及相关控制和管理为单位的干预
- 实现CPU,通道,I/O设备三者的并行操作
- 通道程序
- 通道是通过执行通道程序并于设备控制器共同实现对I/O设备的控制的
- 通道程序是由一系列通道指令所构成的,指令包含以下信息
- 操作码
- 内存地址
- 计数
- 通道程序结束位P
- P=1表示本条指令是通道程序最后一条指令
- 记录结束标志R
- R=0表示本指令和下条指令所处理的数据同属于一个记录
- R=1表示这是处理某记录的最后一条指令
6.5 与设备无关的I/O软件
为了实现设备独立性,必须在设备驱动程序之上再设置一层软件,称为与设备无关的I/O软件
基本概念
- 以物理设备名使用设备
- 早期OS中,程序使用I/O设备时,用的设备的物理名称,导致如果所请求的物理设备已被分配其他进程,尽管由其他相同设备空闲可用,但物理名不同,所有不能分配给程序
- 引入逻辑设备名
- 应用程序可用申请分配不同物理名,但逻辑设备名(类型名)相同的设备
- 用于I/O操作的设备可更换(即重定向),而不必改变应用程序
- 逻辑设备名称到物理设备名称的转换
- 配置逻辑设备表进行转换
与设备无关的I/O软件
- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 暂时性错误
- 持久性错误
- 对独立设备的分破坏回收
- 独立于设备的逻辑数据块
设备分配
-
设备分配中的数据结构
-
考虑因素
-
设备固有属性
不同设备分配策略不同
- 独占设备
- 共享设备
- 虚拟设备
-
设备分配算法
- 先来先服务
- 优先级高者优先
-
设备分配中的安全性
- 安全分配方式
- 一旦进程以获得某设备后便阻塞,直到I/O操作完成才被唤醒
- 不安全分配方式
- 安全分配方式
-
-
独占设备的分配程序
-
基本的设备分配程序
-
依次进行分配设备,控制器,通道
-
逻辑设备表(Logical Unit Table,LUT)
- 整个系统设置一张LUT,用于单用户系统
- 每个用户设置一张LUT
6.6 用户层的I/O软件
假脱机系统SPOOLing
假脱机技术
- 为了缓和CPU的高速性和I/O设备低速性之间的矛盾,引入了脱机输入,输出技术。
- 用一道程序模拟脱机输入时外围控制机的功能,把低速I/O设备上的数据传送到高速磁盘上
- 再用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上
- 实质是将独占设备转化为共享设备的技术。
- 这种联机情况下实现的同时外围操作技术称为SPOOLing技术,或称为假脱机技术
SPOOLing组成
- 输入井和输出井:在磁盘上开辟出来的,用于模拟脱机输入,输出时的磁盘
- 输入缓冲区和输出缓冲区:在内存中开辟出来的,用于缓和CPU和磁盘之间速度不匹配的矛盾
- 输入进程和输出进程,用于模拟脱机输入/输出时的外围控制机
- 井管理程序:用于控制作用和磁盘井之间信息的交换
特点
- 提高了I/O速度
- 将独占设备改造为共享设备
- 实现了虚拟设备功能
假脱机打印机系统
- 每当用户进程发出打印输出请求时
- 在磁盘缓冲区中为之申请一个空闲盘块,将要打印的数据送入其中暂存
- 为用户进程申请一张空白用户请求打印表,并把打印要求填入,将表挂在假脱机文件队列上
- 真正打印输出由假脱机打印进程负责
- 从假脱机文件队列队首取出一张用户请求打印表,将数据由输出井传送到内存缓冲区,再交付打印机打印
守护进程
- 允许使用打印机的唯一进程
- 若有打印请求,唤醒,否则睡眠
- 还有很多其他的守护进程,如网络守护进程
6.7 缓冲区管理
缓冲的引入原因
- 缓冲CPU与I/O设备间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
缓冲区分类
把用户进程称为生产者,产生输出;系统为消费者,提取数据输出。如果生产者已经生产,消费者还未准备好结束,则生产者必须暂停等待,若设置了缓冲区,则无需等待就绪,数据可以先输出到缓冲区
单缓冲区
- 磁盘把数据输入到缓冲区时间T,OS把缓冲区数据传送到用户区时间M,CPU对数据出来时间C,T和C可并行
- 若用户进程已有第二行数据输出时,第一行数据尚未提取完毕,则进程应被阻塞
双缓冲区
- 若缓冲区数据仍未被取走,生产者还是得等待,所以引入了双缓冲取机制,又称为缓冲对换
- 双缓冲区还能让两台机器连接时双向数据传输
环形缓冲区
组成
- 多个缓冲区
- 装输入数据的空缓冲区R
- 已装满数据的缓冲区G
- 计算进程正在使用的现行工作缓冲区C
- 多个指针
- 指示计算进程下个可用缓冲区G的指针Nextg,
- 计算进程正在使用的缓冲区C的指针Current
- 指示输入进程下次可用的空缓冲区指针Nexti
使用
- Getbuf过程
- Releasebuf过程
进程间的同步问题
使用输入循环缓冲,可让输入进程和计算进程并行执行,相应的指针Nexti和Nextg不断沿着顺时针方向移动,可能出现
- Nexti指针追赶上Nextg指针
- 意味着输入进程输入数据速度大于计算进程处理数据速度,已把全部可用空缓冲区装满,此时输入进程应该被阻塞
- Nextg指针追赶上Nexti指针
- 意味着输入进程输入数据速度小于计算进程处理数据速度,全部装有输入数据的缓冲区都被抽空,此时计算进程应该被阻塞
缓冲池Buffer Pool
缓冲池与缓冲区的区别在于:缓冲区仅仅是一组内存块的链表,缓存池是包含一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区
组成
- 空白缓冲队列emq
- 输入队列inq
- 输出队列outq
还有四种工作缓冲区:收容输入数据/输出数据的工作缓冲区,用于提前输入/输出数据的工作缓冲区
工作方式
为使进程都能互斥的访问缓冲池队列,为每个队列设置了一个互斥信号量MS(type),为了进程都能同步的使用缓冲区,又为每个缓冲队列设置了一个资源信号量RS(type)
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));
}
6.8 磁盘存储器的性能和调度
磁盘性能简述
磁盘类型
- 软盘和硬盘
- 单片盘和多片盘
- 固定头磁盘和移动头磁盘
- 固定:每条磁道都有读写磁头
- 移动:每个盘面仅有一个磁头,为访问盘面上的所有磁道,磁头必须移动进行寻道,本节主要针对该磁盘
磁盘访问时间
- 寻道时间Ts:磁头移动道指定磁道所经历时间
- 启动时间s,移动n条磁道,每条m时间
- Ts=m x n+s
- 旋转延迟时间Tr
- 传输时间Tt
磁盘调度算法
以下图例子进程请求访问磁盘先后次序按FCFS为准!
先来先服务FCFS
- 按进程请求访问磁盘的先后次序进行调度
最短寻道时间优先SSTF
- 要求访问的磁道与当前磁头所在磁道距离最近,使每次寻道时间最短
基于扫描的磁盘调度算法
-
扫描SCAN算法/电梯算法
- 基于优先级的调度算法
- 不仅考虑与当前磁道的距离,更优先考虑磁头当前的移动方式
-
循环扫描CSCAN算法
- 将最小磁道号紧接最大磁道号构成循环,进行循环扫描
-
NStepSCAN和FSCAN调度算法
- NStepSCAN
- 将磁盘请求队列分成若干个长度为N的子队列,按FCFS算法依次处理,每处理一个队列时又是按SCAN算法,避免出现粘着现象
- 粘着现象即是磁臂停留在某处不动的情况
- FSCAN
- 将磁盘请求队列分成两个子队列
- 由当前所有请求磁盘I/O的进程形成的
- 在扫描期间新出现的所有请求磁盘I/O的进程放入等待处理的请求队列
- 将磁盘请求队列分成两个子队列
- NStepSCAN