一、I/O控制器
1、主要功能
接受和识别CPU发出的命令(控制寄存器)
向CPU报告设备的状态(状态寄存器)
数据交换(数据寄存器,暂存输入/输出的数据)
地址识别(由I/O逻辑实现)
2、组成
CPU与控制器之间的接口:实现控制器与CPU之间的通信
I/O逻辑:负责识别CPU发出的命令,并向设备发出命令
控制器与设备之间的接口:实现控制器与设备之间的通信
一个I/O控制器可能会对应多个设备
数据寄存器、控制寄存器、状态寄存器可能有多个
3、寄存器编址方式
1)内存映射I/O
控制器中的寄存器与内存统一编制
可以采用对内存进行操作的指令来对控制器进行操作
2)寄存器独立编制
控制器中的寄存器独立编制
需要设置专门的指令来操作控制器
二、I/O控制方式
[计算机组成原理-IO系统]
三、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)缓冲池
三个队列:空缓冲队列、输入队列、输出队列
四个缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收容输出数据的工作缓冲区、用于提取输出数据的工作缓冲区