I/O设备
-
现代计算机系统通常配备大量的I/O设备,用于计
-
算机系统与外部世界(如用户、其它计算机或电 子设备等)进行信息交换或存储
-
I/O设备又称为外围设备或外部设备,简称外设
-
I/O操作:内存和I/O设备之间的信息传送操作 不仅影响计算机的通用性和可扩充性,也是计算机 系统综合处理能力及性价比的重要因素
I/O设备的分类
-
按信息传输方向划分
-
输入设备:将外界信息输入计算机
-
例如:键盘,鼠标,扫描仪等
-
输出设备:将计算结果输出
-
例如:显示器,打印机等
-
输入输出设备:既可以输入信息,也可以输出信息
-
例如:磁盘驱动器,网卡等
按交互功能划分
-
人机交互设备:用于用户与计算机之间的交互通信
-
例如:鼠标,键盘,显示器等
-
存储设备:持久性地存储大量信息并快速检索
-
例如:磁盘驱动器,光盘驱动器等
-
机机通信设备:用于计算机和计算机之间的通信
-
例如:网卡,调制解调器等
-
按设备管理划分
-
字符设备:以字符为单位进行信息交换,发送或接收一个字符流
-
人机交互设备大多是字符设备,例如鼠标、显示器等
-
块设备:以固定大小的数据块(块是存储介质上连续信息组成的一个区域)进行信息交换
-
存储设备通常为块设备,例如磁盘驱动器等
-
网络设备:用于与远程设备通信的设备
-
机机通信设备为网络设备,例如网卡等
-
网络设备可以抽象为传送字符流的特殊字符设备,也可以抽象为传送连续小块数据的块设备
设备管理的目标
- 克服设备和CPU速度的不匹配所引起的问题,使主机和设备并行工作,提高设备使用效率
-
对设备进行抽象,屏蔽设备的物理细节和操作过程,配置驱动程序,提供统一界面,供用户或高层软件使用
-
抽象为文件系统中的节点,统一管理
-
裸设备:不被操作系统直接管理,由应用程序读写,I/O效率更高
设备管理的功能
-
设备中断处理
-
缓冲区管理
-
设备的分配和去配
-
设备驱动调度
-
实现虚拟设备
设备管理的层次
-
I/O硬件
-
I/O设备及其接口线路
-
控制部件
-
通道
-
I/O软件
-
系统I/O软件
-
用户空间I/O软件
设备控制器
-
为达到模块化和通用性的设计目标,通常将I/O设备中的机械部件和电子部件分开处理
-
其中,电子部件称为设备控制器
-
设备控制器又称为设备适配器、I/O控制器、I/O控制接口,简称I/O模块或I/O接口
-
操作系统与控制器交互,而非与设备交互设备
控制器的功能
-
设备控制器是CPU与设备之间的接口
-
接收和识别CPU或通道发来的命令
-
实现数据交换
-
发现和记录设备及自身的状态信息,供CPU处理使用
-
当连接多台设备时,设备地址识别
设备控制器的组成部分(例)
-
状态/控制寄存器
-
数据缓冲寄存器
-
地址译码器和I/O控制逻辑
-
外设接口控制逻辑
轮询方式
-
流程:
-
处理器向控制器发送一个I/O命令
-
如果设备未就绪,则重复测试过程,直至设备就绪
-
执行数据交换
-
等待I/O操作完成后,才可以继续其它操作
-
处理I/O请求会终止原程序的执行
-
CPU需要等待I/O设备就绪
-
CPU需要参与数据传送
-
CPU和设备只能串行工作,效率低下
中断方式
-
流程:
-
处理器向控制器发出一个I/O命令,然后继续执行后续指令
-
如果该进程不需要等待I/O完成,后续指令可以仍是该进程中的指令
-
否则,该进程在这个中断上挂起,处理器执行其他工作
-
控制器检查设备状态,就绪后发起中断
-
CPU响应中断,转向中断处理程序
-
中断处理程序执行数据读写操作
-
恢复执行原先的程序
-
响应中断后会终止原程序的执行
-
CPU不需要等待I/O设备就绪
-
CPU需要参与数据传送
-
CPU和设备部分并行操作,效率有所提高
直接存储器访问(DMA)方式
-
DMA模块
-
模仿处理器来控制主存和设备控制器之间的数据交换
-
流程:
-
处理器向DMA模块发出I/O命令
-
处理器继续执行其它工作,DMA模块负责传送全部数据
-
数据传送结束后,DMA中断处理器
-
CPU不会终止原程序的执行
-
CPU只在数据传送的开始和结束时参与
-
开始时,CPU需要对DMA模块进行初始化
-
结束时,CPU响应中断,但不必保存现场
DMA方式中的周期窃取
当DMA和CPU同时经总线访问内存时,CPU总是将总线的占有权让给DMA一个或几个主存周期
周期窃取对延迟CPU与主存的数据交换影响不大
数据传送过程是不连续的和不规则的
CPU大部分情况下与Cache进行数据交换,直接访问内存较少
I/O控制方式的演化
-
采用轮询方式的设备控制器
-
CPU需要等待设备就绪,且参与数据传送
-
采用中断方式的设备控制器
-
CPU无需等待设备就绪,但响应中断后参与数据传送
-
通过DMA直接控制存储器
-
CPU在数据传送开始和结束时参与,与主存进行数据交换时不参与
I/O通道
-
又称为通道控制器、I/O处理器
-
设备控制器包含自身专用的处理器和通道程序
-
I/O指令不再由处理器执行,而是存在主存中,由I/O通道所包含的处理器执行
-
采用四级连接:处理器,通道,控制器,设备
-
可控制多台同类或不同类的设备
-
流程:
-
CPU在遇到I/O请求,启动指定通道
-
一旦启动成功,通道开始控制I/O设备进行操作,CPU执行其他任务
-
I/O操作完成后,I/O通道发出中断,CPU停止当前工作,转向处理I/O操作结束事件
-
CPU与通道并行工作
-
带有局部存储器的I/O通道
-
相当于一台自治的计算机
-
I/O指令存储在控制器自带的局部存储器中,并由I/O通道所包含的处理器执行
-
可以控制大量的I/O设备,同时最小化CPU的干涉
-
常用于交互式终端通信,负责包括控制终端在内的大部分任务
I/O发展对总线的影响
-
单总线
-
将CPU、主存和I/O模块连接到同一组总线上
-
优点:结构简单,易于扩充
-
缺点:主存需要和I/O模块共用总线;设备增多会造成总线变长,进而增加传输时延;无法适用于大量高速设备
-
传统的三级总线(例)
-
主存和Cache通过主存总线传送数据,主存总线和扩展总线上的I/O设备之间传送数据通过扩展总线接口缓冲
-
优点:主存与I/O之间的数据传送与处理器的活动分离;可以支持更多的I/O设备
-
缺点:不适用于I/O设备数据速率相差太大的情形
-
采用南北桥的多级总线(例)
-
通过存储总线、PCI总线、E(ISA)总线分别连接主存、高速I/O设备和低速I/O设备
-
优点:可以支持不同数据速率的I/O设备
-
采用I/O通道的多级总线(例)
-
支持CPU、主存和多个I/O通道之间的数据传送
-
支持I/O通道和I/O控制器,以及I/O控制器和设备之间的数据传送
I/O软件
-
设计目标
-
高效率:改善设备效率,尤其是磁盘I/O操作的效率
-
通用性:用统一的标准来管理所有设备
-
设计思路
-
把软件组织成层次结构,低层软件用来屏蔽硬件细节,高层软件向用户提供简洁、友善的界面
-
主要考虑的问题
-
设备无关性:编写访问文件的程序与具体设备无关
-
出错处理:低层软件能处理的错误不让高层软件感知
-
同步/异步传输:支持阻塞和中断驱动两种工作方式
-
缓冲技术:建立数据缓冲区,提高吞吐率
I/O软件的层次结构
-
I/O中断处理程序
-
位于操作系统底层,与硬件设备密切相关,与系统其余部分尽可能少地发生联系
-
进程请求I/O操作时,通常被挂起,直到数据传输结束后并产生I/O中断时,操作系统接管CPU后转向中断处理程序
-
当设备向CPU提出中断请求时,CPU响应请求并转入中断处理程序
I/O中断处理程序的功能
-
检查设备状态寄存器内容,判断产生中断的原因,根据I/O操作的完成情况进行相应的处理
-
如果数据传输有错,向上层软件报告设备的出错信息,实施重新执行
-
如果正常结束,唤醒等待传输的进程,使其转换为就绪态
-
如果有等待传输的I/O命令,通知相关软件启动下一个I/O请求
设备驱动程
-
包括与设备密切相关的所有代码
-
从独立于设备的软件中接收并执行I/O请求
-
把用户提交的逻辑I/O请求转化为物理I/O操作的启动和执行
-
监督设备是否正确执行,管理数据缓冲区,进行必要的纠错处理
设备驱动程序的功能
-
设备初始化
-
在系统初次启动或设备传输数据时,预置设备和控制器以及通道状态
-
执行设备驱动例程
-
负责启动设备,进行数据传输
-
对于具有通道方式,还负责生成通道指令和通道程序,启动通道工作
-
调用和执行中断处理程序
-
负责处理设备和控制器及通道所发出的各种中断
设备驱动程序的层次
-
每个设备驱动程序只处理一种设备,或者一类紧密相关的设备
-
设备驱动程序分为整体驱动程序和分层驱动程序
-
整体驱动程序直接向操作系统提供接口和控制硬件
-
适用于功能简单的驱动程序,效率较高,但较难迁移
-
分层驱动程序将驱动程序分成多层,放在栈中,系统接到I/O请求时先调用栈顶的驱动程序,栈顶的驱动程序可以直接处理请求或向下调用更低层的驱动程序,直至请求被处理
-
适用于功能复杂、重用性要求较高的驱动程序,结构清晰且便于移植,但会增加一部分系统开销
独立于设备的I/O软件
-
执行适用于所有设备的常用I/O功能,并向用户层软件提供一致性接口
-
功能
-
设备命名:通过路径名寻址设备
-
设备保护:检查用户是否有权访问所申请设备
-
提供与设备无关的数据单位:字符数量,块尺寸
-
缓冲技术:传输速率,时间约束,不能直接送达目的地
-
设备分配和状态跟踪:分配不同类型的设备
-
错误处理和报告:驱动程序无法处理的错误
用户空间的I/O软件
-
库函数
-
一小部分I/O软件不在操作系统中,是与应用程序链接在一起的库函数,甚至完全由运行于用户态的程序组成
-
系统调用通常由库函数封装后供用户使用,封装函数只是将系统调用所用的参数放在合适位置,然后执行访管指令来陷入内核,再由内核函数实现真正的I/O操作
-
SPOOLing软件
-
在内核外运行的系统I/O软件,采用预输入、缓输出和井管理技术,通过创建守护进程和特殊目录解决独占型设备的空占问题
I/O缓冲
-
目的
-
解决CPU与设备之间速度不匹配的矛盾,协调逻辑记录大小和物理记录大小不一致的问题,提高CPU和设备的并行性,减少I/O操作对CPU的中断次数,放宽对CPU中断响应时间的要求
-
缓冲区
-
在内存中开辟的存储区,专门用于临时存放I/O操作的数据
-
操作
-
写操作:将数据送至缓冲区,直到装满,进程继续计算,同时系统将缓冲区的内容写到设备上
-
读操作:系统将设备上的物理记录读至缓冲区,根据要求将当前所需要的数据从缓冲区中读出并传送给进程
单缓冲
-
操作系统在主存的系统区中开设一个缓冲区
-
输入:将数据读至缓冲区,系统将缓冲区数据送至用户区,应用程序对数据进行处理,同时系统读入接下来的数据
-
输出:把数据从用户区复制到缓冲区,系统将数据输出后,应用程序继续请求输出
双缓冲
-
使用两个缓冲区
-
输入:设备先将数据输入缓冲区1,系统从缓冲区1把数据传到用户区,供应用程序处理,同时设备将数据传送到缓冲区2
-
输出:应用程序将数据从用户传送到缓冲区1,系统将数据传送到设备,同时应用程序将数据传送到缓冲区2
循环缓冲
-
操作系统分配一组缓冲区,每个缓冲区度有指向下一个缓冲区的链接指针,构成循环缓冲
-
解决设备和进程速度不匹配的问题
-
为系统公共资源,供进程共享并由系统统一分配和管理
如果您决觉得这篇文章对您有小小的帮助的话,可以关注下方公众号,在公众号同样会推送技术给大家。