IO软件层次结构
用户层软件<br>向用户提供IO相关库函数<br>
设备独立性/无关性软件<br>·向上提供系统调用接口<br>·实现设备的保护(设备视为文件)<br>·(设备)差错处理<br>·设备分配与回收(临界资源)<br>·数据缓冲区管理<br>·建立逻辑设备名↔物理设备名的映射<br>··LUT逻辑设备表:OS统一LUT vs. 用户独立LUT<br> LUT表项:逻辑设备名(含路径)-物理设备名-驱动程序入口<br>
设备驱动软件<br>·负责硬件的具体控制(设置寄存器、检查状态)<br>··不同厂家硬件特性不同,需要专用的驱动
中断处理程序<br>IO完成时,IO控制器发送中断信号<br>由OS分析中断信号并作出相应处理<br>也要和硬件交互<br>
硬件
IO核心子系统
IO调度
可以看做“磁盘调度”的扩展集,使用相似的思想处理
设备保护
UNIX系统“一切皆文件”,设备也有FCB
通过FCB可以实现设备保护
假脱机技术<br>(SPOOLing)<br>
在用户层实现,可以将独占式设备改造为共享式设备<br>
脱机技术即脱离主机控制的操作,缓和了外围设备IO和CPU的速度矛盾
原理分析:共享打印机<br>
设备分配与回收
设备固有属性
独占设备
共享设备:一般是宏观共享
虚拟设备:采用SPOOLing技术生成的“共享设备”
安全性
安全分配方式
将资源分配后进程将阻塞,直到本次IO完成
破坏了请求-保持条件,不会死锁
对进程而言,CPU和IO设备只能串行工作
不安全分配方式
进程只会在IO请求失败时阻塞
进程可以同时使用多个设备<br>
可能死锁(银行家算法、死锁检测-解除)
实现
一个通道控制多个控制器,一个控制器可控制多个设备<br>
数据结构
每设备配置一张设备控制表DCT
每设备控制器配置一张控制器控制表COCT
通道配置一张通道控制表CHCT<br>
系统控制表SDT:记录所有设备
分配步骤
根据进程提供的物理设备名寻找SDT
改进:进程可提供逻辑设备名(设备类型),映射由LUT完成
由SDT找到DCT,若忙碌将PCB挂到对应设备的等待队列,否则将设备分配给进程
找到COCT,若忙碌将PCB挂到对应<font color="#F44336">设备控制器</font>的等待队列,否则将<font color="#F44336">设备控制器</font>分配给进程
找到CHCT,若忙碌将PCB挂到对应<font color="#F44336">通道</font>的等待队列,否则将<font color="#F44336">通道</font>分配给进程
仅有三者的分配全部成功才算设备分配成功
IO设备
分类
按信息交换单元
块设备:可寻址
字符设备:不可寻址,通常采用中断驱动
可以向计算机输入数据<br>也可接收计算机输出数据<br>
鼠标键盘
显示器
移动硬盘
UNIX系统将IO设备抽象为特殊的文件。<br>将IO操作统一到读写操作中<br>
缓冲区管理
缓冲区是一个存储区域,既可以由专门的硬件寄存器构成,也可使用内存。
专用硬件缓冲区成本高容量小,仅用于对速度要求极高的场合(TLB相联存储器)
作用
缓和CPU与IO设备的速度矛盾<br>
减少CPU中断频率,放宽CPU中断响应时间的限制
解决数据粒度不匹配的问题
提高CPU和IO设备的并行性能
实现
单缓冲
若无特殊说明,缓冲区大小为1块
只能向空缓冲区充入数据
缓冲区非空时,只允许从缓冲区取出数据
缓冲区充满时
双缓冲
为进程分配两个缓冲区
允许同时传送、输入(不同的缓冲区)
允许同时输入、计算<br>
不允许同时传送、计算
循环缓冲区
大小相等的缓冲区链接为循环队列
in指针指向下一个可充入的缓冲区,out指针指向下一个可取出的缓冲区
缓冲池
众多共用缓冲区组成
按状态组织为:空缓冲队列、输入队列、输出队列
按用途可分为:接收设备输入hin、进程提取输入sin、接收进程输出hout、设备提取输出sout
考察
平均周期
设置初始状态,分析下次进入此状态的时间
单缓冲=max(T,C)+M
双缓冲=max(T,C+M)