I/O管理
一、I/O控制器
1、主要功能
接受和识别CPU发出的命令(控制寄存器)
向CPU报告设备的状态(状态寄存器)
数据交换(数据寄存器,暂存输入/输出的数据)
地址识别(由I/O逻辑实现)
2、组成
CPU与控制器之间的接口:实现控制器与CPU之间的通信
I/O逻辑:负责识别CPU发出的命令,并向设备发出命令
控制器与设备之间的接口:实现控制器与设备之间的通信
一个I/O控制器可能会对应多个设备
数据寄存器、控制寄存器、状态寄存器可能有多个
3、寄存器编址方式
1)内存映射I/O
控制器中的寄存器与内存统一编制
可以采用对内存进行操作的指令来对控制器进行操作
2)寄存器独立编制
控制器中的寄存器独立编制
需要设置专门的指令来操作控制器
二、I/O控制方式
三、I/O软件层次结构
用户层软件:实现与用户交互的接口,向上提供方便易用的库函数
设备独立性软件:
- 向上层提供统一的调用接口(如 read/write 系统调用)
- 设备的保护
- 差错处理
- 设备的分配与回收
- 数据缓冲区管理
- 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序
设备驱动程序:设置设备寄存器、检查设备状态
中断处理程序:进行中断处理
硬件:执行I/O操作,有机械部件、电子部件组成
直接涉及到硬件具体细节、且与中断无关的操作肯定是在设备驱动程序层完成的
没有涉及硬件的、对各种设备都需要进行的管理工作都是在设备独立性软件层完成的
四、I/O核心子系统
1、概述
2、假脱机技术
脱机技术:解决设备与CPU的速度矛盾,实现预输入缓输出
假脱机技术:又叫SPOOLing技术,用软件的方式模拟脱机技术
- 输入井和输出井:模拟脱机输入/输出时的磁带
- 输入进程和输出进程:模拟脱机输入/输出时的外围控制机
- 输入缓冲区和输出缓冲区:内存中的缓冲区,输入、输出时的"中转站"
3、设备的分配与回收
1)考虑的因素
- 固有属性 :独占设备、共享设备、虚拟设备(SPOOLing)
- 分配算法:先来先服务、优先级高者优先、短任务优先等
- 安全性:安全分配方式、不安全分配方式
2)静态分配与动态分配
静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源
动态分配:进程运行过程中动态申请设备资源
3)设备分配管理中的数据结构
一个通道可控制多个设备控制器,每个设备控制器可控制多个设备。
设备控制表(DCT):每个设备对应一张DCT,关键字段:类型/标识符/状态/指向COCT的指针/等待队列指针
控制器控制表(COCT):每个控制器对应一张COCT,关键字段:状态/指向CHCT的指针/等待队列指针
通道控制表(CHCT):每个控制器对应一张CHCT,关键字段:状态/待队列指针
系统设备表(SDT):记录整个系统中所有设备的情况,每个设备对应一个表目,关键字段:设备类型/标识符/DCT/驱动程序入口
4)设备分配的步骤
- 根据进程请求的物理设备名查找SDT
- 根据SDT找到DCT并分配设备
- 根据DCT找到COCT并分配控制器
- 根据COCT找到CHCT并分配通道
只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备进行数据传送
缺点:用户编程时必须使用"物理设备名",若换了一个物理设备,则程序无法运行。若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
5)设备分配步骤的改进
逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。
用户编程时使用逻辑设备名申请设备,操作系统负责实现从逻辑设备名到物理设备名的映射(通过LUT)
- 整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复
- 每个用户一张LUT:各个用户的逻辑设备名可重复
4、缓冲区管理
1)缓冲区的概念
一般利用内存作为缓冲区
缓冲区作用:
- 缓解CPU与设备的速度矛盾
- 减少对CPU的中断频率
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
2)单缓冲
当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出。
当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
T > C,因此CPU处理完数据后暂时不能将下一块数据传送到工作区,必须等待缓冲区中冲满数据
T < C,因此缓冲区中冲满数据后暂时不能继续冲入下一块数据,必须等待CPU处理结束后将数据从缓冲区传送到工作区
处理一块数据平均耗时
Max(C, T)+M
分析问题的初始状态:工作区满,缓冲区空
3)双缓冲
T > C + M
T < C + M
处理一块数据平均耗时
Max(T, C+M)
分析问题的初始状态:工作区空,一个缓冲区满,另一个缓冲区空
4)循环缓冲
多个缓冲区链接成循环队列,in指针指向第一个空缓冲区,out指针指向第一个满缓冲区
5)缓冲池
三个队列:空缓冲队列、输入队列、输出队列
四个缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收容输出数据的工作缓冲区、用于提取输出数据的工作缓冲区