I/O管理概述
I/O设备的基本概念与分类
接下来我们介绍以下I/O设备管理的知识,首先我们学习认识一下I/O设备
什么是I/O设备
顾名思义,就是输入/输出设备(Input/Output)。I/O设备可以将数据传入到计算机,或者可以接受计算机输出数据的外部设备,属于计算机的硬件部分。
这里的输入和输出都是以计算机的视角来看的。所以显示器是计算机线束输出数据所以为输出设备。在UNIX系统中将外部设备抽象为了一种特殊的文件,用户可以使用与文件操作系统相同的方式对外部设备进行操作。例如write操作就是向外部设备输出数据,read操作就是从外部设备读入数据。
I/O设备根据使用特性的分类
可以分为:
- 人机交互类外部设备(数据传输速度慢)
- 存储设备(数据传输速度快)
- 网络通信设备(数据传输速度介于两者之间)
I/O设备根据传输速度分类
- 低速设备
- 中速设备
- 高速设备
I/O设备根据信息交换的单位分类
- 块设备(传输速率较高,可以寻址,即对他可以随机的读/写任意一块)
- 字符设备(传输速率慢,不可寻址,在输入输出时常采用中断驱动方式)
总结
I/O控制器
I/O控制器主要由机械部件和电子部件组成,这里我们依次介绍。
I/O设备的机械部件
I/O的机械部件主要用于执行具体的I/O操作,如鼠标/键盘的按钮,显示器的LED屏,移动硬盘的磁臂,磁盘盘面等。
而I/O的电子部件通常是一块插入主板扩充槽的印刷电路板。
I/O设备的电子部件(I/O控制器)
CPU无法直接控制I/O设备的机械部件,因此I/O设备还要有一个电子部件作为CPU和I/O设备机械部件之间的桥梁,勇于实现CPU对设备的控制,这个电子部件就是I/O控制器,又称为设备控制器。CPU可以控制I/O控制器,所以可以通过I/O控制器来控制设备的机械部件。
I/O控制器主要有以下功能:
- 接受和识别CPU发出的命令(如CPU发来的read/write命令,I/O控制器中会有相应的控制寄存器来存放命令与参数)
- 向cpu报告设备的状态(I/O控制器有相应的状态寄存器,用于记录I/O设备的当前状态,1表示空闲,0表示忙碌,当然也有的控制器为1表示忙碌,0表示空闲,这个看厂商的设定)
- 数据交换(I/O控制器会设置相应的数据寄存器。输出时,数据寄存器用于暂存CPU发来的数据,之后再由控制器传达给IO设备。输入时,数据寄存器暂存设备发来的数据,之后CPU从数据寄存器中取走数据)
- 地址识别(类似于内存的地址,为了区分不同设备控制器中的各个寄存器,也需要给各个寄存器设置一个特定的寄存器,I/O控制器通过CPU提供的地址来判断CPU要读/写的是哪一个寄存器)
I/O控制器的组成
所以①一个I/O可能会对应多个设备②数据寄存器,控制寄存器,状态寄存器等可能会有多个(例如每一个控制/状态寄存器对应一个具体的设备),且这些寄存器都要有相应的地址,才能方便CPU的操作。有的计算器会让这些寄存器占用内存地址的一部分,称为内存映像I/O,另外一些计算机则采用I/O专用地址即寄存器独立编址。
思考:两种寄存器地址组成形式有什么区别?
所以我们可以看出内存映像I/O貌似性能更好。
总结
I/O控制方式
那么I/O控制器具体通过什么方法来控制I/O设备呢?我们也会有多种形式其中主要会影响到读/写操作的流程,CPU的干预频率,数据传送的单位,数据流向等问题。
程序直接控制
我们以读操作为例
①CPU向控制器发出读数据的命令。于是I/O控制器设备启动并且状态寄存器设置为1(未就绪)然后开始做准备工作让输入设备准备输入数据同时控制器自身准备接受数据到数据寄存器
②CPU轮询检查控制器的状态是否就绪,即CPU时刻准备与控制器进行工作
③输入设备准备好数据后将数据传给控制器同时报告自身状态
④控制器将输入的数据放到数据寄存器,并且将自身的状态更改为0(表示已就绪和CPU进行交换工作)
⑤CPU发现控制器设备已经就绪,那么就将数据寄存器中的数据读入到CPU的寄存器中同时把CPU寄存器中的内容放到内存以便进行数据交换
⑥如果还要继续读入数据,那么CPU继续发出读的指令
-
CPU干预频率:这样的方式CPU的干预频率很频繁,I/O操作开始之前,完成之后需要CPU介入,并且等待I/O完成的过程中需要不断地轮询检查。
-
数据传送单位:每次读/写一个字
-
数据流向:
读操作(数据输入):I/O设备->CPU(包括CPU寄存器)->内存
写操作(数据输出):内存->CPU(包括CPU寄存器)->I/O设备
每个字的读/写都需要CPU的帮助
-
优点:实现简单,在读/写指令后加上循环检查的一系列指令即可。
-
缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于忙碌状态,CPU利用率低。
中断驱动方式
引入中断机制,由于I/O设备很慢,因此CPU发出读/写命令以后可以将等待I/O的进程阻塞,先切换到其他进程。当I/O设备完成后,控制器会向CPU发送一个中断信号,CPU检测到中断信号后保存当前进程的运行环境信息,然后转去执行中断处理程序来处理中断。处理中断的过程中,CPU从I/O控制器中读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行。
这样就不是cpu主动一直询问控制器设备是否就绪了,而是当控制器就绪后主动告诉CPU。这里我们要注意:
①CPU会在每个指令周期的末尾检查中断
②中断处理过程中需要保存,恢复进程的运行环境,这个过程是需要一定的时间开销的。可见,如果中断发生的频率也会降低系统性能。
-
CPU干预频率:每次I/O操作开始之前,完成之后需要CPU的介入。等待I/O完成的过程中CPU可以切换到别的进程执行。
-
数据传送单位:每次读/写一个字
-
数据的流向:
读操作(数据输入):I/O设备->CPU(包括CPU寄存器)->内存
写操作(数据输出):内存->CPU(包括CPU寄存器)->I/O设备
每个字的读/写都需要CPU的帮助
-
优点:和程序直接控制方式相比,CPU不用一直不停的轮询,CPU和I/O设备可以并行工作,CPU利用率得到明显的提升
-
缺点:每个字在I/O设备和内存之间的传输,都需要经过CPU。并且频繁的中断也会消耗较多的CPU时间。
DMA方式
与“中断驱动方式”相比,DMA(Direct Memory Access,直接存储器存取,主要用于块设备的I/O控制)有这样几个改进:
- 数据的传送是“块”,不再是一个字,一个字的传送
- 数据流向是设备直接放到内存,或者内存到设备,不再需要CPU的帮助
- 仅在传送一个或多个数据块的开始和结束时,才需要CPU干预
DMA控制器
所以这个方法需要DMA控制器来服务。DMA控制器结构如下:
- DR(Data Register,数据寄存器):暂存从设备到内存,或者从设备到内存的数据
- MAR(Memory Address Register,内存地址寄存器):在输入时,MAR表示数据应该放到内存中的什么位置,输出时MAR表示要输出的数据放在内存中的什么位置
- DC(Date Counter,数据计数器):表示剩余要读/写的字节数
- CR(Command Register,命令/状态寄存器):用于存放CPU发来的I/O命令,或设备的状态信息。
-
CPU干预频率:仅在传送一个或多个数据块的开始和结束时,才需要CPU干预
-
传送数据的单位:每次读/写一个或多个块(注意每次读写的都是连续的多个块,且这些块读入内存后在内存中也必须是连续的)
-
数据流向(不需要CPU帮助):
读操作(数据输入):I/O设备->内存
写操作(数据输出):内存->I/O设备
-
优点:数据时以“块”为单位,CPU介入频率进一步降低。数据的传输不在需要经过CPU在写入内存,数据效率高。CPU和I/O设备的并行性也进一步提升。
-
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。如果要读/写多个离散的存储块,或者将数据分别写到不同的内存区域时,CPU要分别发出多条I/O指令,进行多次中断处理才能完成。
通道控制方式
通道:一种硬件,可以理解为“弱鸡版CPU”,也是可以识别并执行一系列通道指令
和CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存。
-
CPU干预频率:极低,通道会根据CPU的知识执行相应的通道程序,只有完成一组数据块的读/写操作后才需要发出中断信号,请求CPU干预
-
数据传送的单位:每次读/写一组数据块
-
数据的流向(在通道的控制下进行):
读操作(数据输入):I/O设备->内存
写操作(数据输出):内存->I/O设备
-
优点:CPU,通道,I/O设备并行工作,资源利用率很高
-
缺点:实现复杂,需要专门的通道硬件支持
总结
控制方式 | 完成一次读/写的过程 | CPU干预频率 | 每次I/O的数据传输单位 | 数据流向 |
---|---|---|---|---|
程序直接控制方式 | CPU发出I/O命令后需要不断轮询 | 极高 | 字 | 设备->CPU->内存 内存->CPU->设备 |
中断驱动方式 | CPU发出I/O命令后可以做其他事,本次I/O完成后设备控制器发出中断信号 | 高 | 字 | 设备->CPU->内存 内存->CPU->设备 |
DMA方式 | CPU发出I/O命令后可以做其他事,本次I/O完成后,DMA控制器发出中断信号 | 中 | 块 | 设备->内存 内存->设备 |
通道控制方式 | CPU发出I/O命令后可以做其他事,通道会执行通道程序以完成I/O,完成后通道向cpu发出中断信号 | 低 | 一组块 | 设备->内存 内存->设备 |
每一个阶段的优点都是上一个阶段的最大缺点,总体来看,整个发展过程就是尽量减少CPU干预,把CPU从繁杂的I/O控制事务中解脱出来,以便更多的完成数据处理任务。