- 设备驱动程序
- 设备独立性软件
- 用户层的io
- 缓冲区
设备驱动程序
功能
- 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换与设备相关的低层操作序列
- 检查用户请求的合法性,了解I/O设备的工作状态,传递与IO设备操作有关的参数,设置设备的工作方式
- 发出I/O命令,如果设备空闲,便立即启动IO设备,完成指定的IO操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待
- 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理
特点
- 驱动程序是实现在与设备无关的软件和设备控制器之间通信和转换的程序
- 与设备控制器以及I/O设备的硬件特性紧密相关
- 与I/O设备所采用的I/O控制方式紧密相关
- 与硬件紧密相关(使用汇编语言)
- 应允许可重入
设备处理方式
为每一类设备设置一个进程 专门用于执行这类设备的io操作
整个系统中设置一个io进程 专门用于执行系统中所有各类设备的io操作
不设置专门的设备处理进程 只为各类设备设置相应的设备驱动程序
设备驱动程序的主要任务:
启动指定设备,完成上层指定的io工作
处理的过程
将抽象的要求转换为具体的要求 在驱动程序中 将要求转换为命令 数据 参数
对服务请求进行校验 检查io请求该设备是否能够执行
检查设备的状态 检查设备是否进去就绪状态
传送必要的参数 在确定涉笔处于就绪状态后,可以将控制器的数据和本次数据传输有关的参数传送到相应的寄存器中
启动io设备 驱动程序可以向控制器中的命令寄存器传输相应的控制命令
对io设备的控制方式
轮询的可编程io方式
CPU干预的频率:频繁
数据传送的单位:字
数据的流向:
写: 内存 CPU IO
读:IO CPU 内存
实现简单
CPU利用率低
中断的可编程io方式
CPU干预的频率:只在io开始和完成干预
数据传送的单位:字
数据的流向:
写: 内存 CPU IO
读:IO CPU 内存
CPU和io可以并行工作
要进行频繁的中断处理,会消耗较多的CPU时间
直接存储器访问方式
CPU干预的频率:只有传送的开始和结束时干预
数据传送的单位:块
数据的流向:
写: 内存 IO
读:IO 内存
CPU介入频率大幅度降低
每次发送一条IO指令,只能读写一个或者多个连续的数据块
io通道控制方式
CPU干预的频率:极低
数据传送的单位:一组数据块
数据的流向:
写: 内存 IO
读:IO 内存
CPU 通道 io设备可以并行工作 资源利用效率很高
硬件设施复杂
表中记录的信息: 执行的操作 程序结束位 记录结束 读写字节数 内存地址(读写内存首址)
设备独立性软件
与设备无关的软件
1. 以物理设备名使用设备
2. 引入逻辑设备名
例如打印机:/dev/printer
io重定向:用于io操作的设备可以更换,二不必改变应用程序
3. 逻辑设备名称到物理设备名称的转换
程序执行的时候,要根据逻辑设备表,将逻辑地址转换为物理地址
功能:
设备驱动程序的统一接口
每个设备驱动程序与io之间都有相近的接口
将抽象的设备名称映射到适当的驱动程序上
缓冲管理
差错控制
暂时性的错误:网络传输数据 磁盘传输数据
持久性的错误:电源掉电 磁盘划痕 计算除以零
对独立设备进行分配与回收
设计提供大小统一独立于设备的逻辑数据块,隐藏差异
设备分配
DCT 设备控制表
设备类型
设备标识符
设备状态:是否在等待 忙or闲
指向控制表的指针
重复执行的次数或者时间
设备队列的队首指针
控制器控制表COCT
通道控制表 CHCT
系统设备表SDT
设备分配时应该考虑的因素
设备固有属性
独占设备 共享设备 虚拟设备
分配算法
先来先服务 优先级高者优先
安全性
安全分配方式 进程一旦获得某种设备便阻塞,不能再请求任何资源
不安全分配方式 进程持续发现io请求,知道请求设备被占用,才会被阻塞
逻辑设备名到物理设备映射的实现
逻辑设备表: 逻辑设备名 物理设备名 驱动程序入口地址
逻辑设备表的设置方法:
整个系统设置一张LUT
每个用户设置一张LUT
用户层的io
假脱机系统 Spooling
输入设备→输入缓冲区(内存)→输入井(磁盘)
输出设备←输出缓冲区(内存)←输出井(磁盘)
特点:
提高了IO的速度
独占设备改造为共享设备
实现了虚拟设备功能
守护进程 daemon
守护进程+假脱机文件队列(目录)
打印机守护进程
服务器守护进程
网络守护进程
缓冲区
解决的问题
缓和CPU和I/O设备间速度不匹配的矛盾
减少对CPU的中断频率,放宽对CPU中断响应时间的限制
解决数据粒度不匹配的问题
提高CPU和I/O设备之间的并行性
分类:
单缓冲区
双缓存区
环形缓冲区
进程间同步可能出现的问题
输入进程数据的速度 > 计算进程处理数据的速度
系统受计算的限制,缓冲区满
输入进程数据的速度 < 计算进程处理数据的速度
系统受io限制,无数据可算
缓冲池
既可以用于输入,又可以用于输出
公用,共享
组成:空白缓冲队列 输入队列 输出队列
Getbuf过程
//Getbuf
void Getbuf(unsigned type){
Wait(RS(type));
Wait(MS(type));
B(number)=Takebuf(type);
Signal(MS(type));
}
Putbuf过程
//Putbuf
void Putbuf(unsigned type){
Wait(RS(type));
Addbuf(type, number);
Signal(MS(type));
Signal(RS(type));
}
与缓冲区的区别:
缓冲区是一组内存块的链表
缓冲池是一个管理的数据结构,一组操作函数的管理机制