4.1.概述
IO,input output的缩写,即计算机的输入输出系统。这里我们要明确输入输出的边界是哪里。向主机内部送称为输入,向主机外部送称为输出,直白且笼统的来说的话向磁盘或者网络里送称为输出,向内存里送称为输入。
整个IO的发展经历了以下几个阶段:
- 分散连接
- IO总线
- 通道
- IO处理机
分散链接:
早期主机和IO设备分散直连,IO的控制由CPU来负责,因此整个IO期间IO和CPU需要一直保持联络,由于速率的不对等,因此一个IO周期中CPU大部分时间处于是停等状态。
IO总线:
为了提高效率,出现了IO接口和DMA控制器。IO设备通过IO接口连入IO总线,DMA控制器专门负责IO的控制,从而解放出CPU,使得CPU在IO周期间不必停等。CPU和IO之间是并行的。此方式中IO的控制均交给DMA控制器来完成(指令交给控制器来负责),但是控制器不具备数据的处理功能(如读数、写数),因此数据的处理功能仍然要走CPU。
通道:
通道,一种简单的处理器,比起DMA多了数据处理功能,使得IO的控制、数据处理完全从CPU中剥离出来,为CPU减负。一个通道可以连接多个IO设备,即一条通道供多个IO设备“行走”。
IO处理机:
通道技术的升级版,直接采用和主机CPU结构相同的小型CPU来完全负责IO的控制和数据处理。
4.2.组成
IO系统由软件、硬件两部分组成:
- 软件
- IO指令
- 通道指令
- 硬件
IO指令:
CPU指令集中的一部分
操作码,IO指令的标志,标识该指令为IO指令。
命令码,指出对IO指令做什么操作。
设备吗,标识所要操作的IO设备是哪个。
通道指令:
由于通道本质上是一个简单的处理器因此有自己的一套指令集。通道指令中指出要传输的成块数据的首地址、传输的长度、操作指令。
硬件:
IO系统中的硬件包括:设备、IO接口、通道、设备控制器。
4.3.编址
IO设备接入以后会被分配一个设备地址,主机根据设备地址找到相应的IO设备。分配设备地址的方式有如下几种:
- 统一编址
- 非统一编址
统一编址:
内存中留出一块来作为IO地址,也就是说使用内存地址为IO设备编址,只要寻址时,地址落在IO地址中则说明是一次IO操作。IO操作沿用CPU的指令集,直接向该地址进行读写,即可实现输入输出。
非统一编址:
在内存之外设计一块存储空间用来为设备进行编址,IO操作有专门的IO指令,对IO设备进行输入输出操作。
4.4.IO接口
IO接口,用于IO设备接入主机的接口,IO接口的作用主要是:
- 数据转换
- 速度适配
数据转换:
由于不同外设的协议可能不同,IO接口要设配各种外设。
速度适配:
不同的IO设备速度不同,如键盘,输入的速度较慢,数据量较小,及时传输,但如硬盘,输入的速度较快,输入的量也较大,可能来不及及时传输,就需要先缓存起来。总的来说就是做一个速度的适配。
4.5.传输控制
IO中因为数据是来自外部,数据不是主机随叫随到的,有一个等待数据输入的过程,CPU怎样去感知IO是否完成,数据是不是准备好了?这就要CPU和IO设备之间打交道,进行信息传递了,IO设备和主机之间的信息传送方式由如下几种:
- 程序查询方式
- 程序中断方式
- DMA方式
4.5.1.程序查询方式
在程序查询方式中,CPU和IO设备是串行执行的。每次CPU遇到IO指令时,都要去主动询问IO,数据是否准备好,准备好,开始读写IO,没有准备好的话,CPU会等待并且循环发送信息去询问IO——是否准备好?
由于CPU和IO速率存在级差,CPU会大量时间处于空转等待,浪费了CPU资源。
4.5.2.程序中断方式
程序中断方式是对程序查询方式的一种改进,在程序中断方式中,CPU和IO并发执行。CPU执行到IO指令后,启动IO,但不等待,直接转而执行其他任务。IO自己准备好以后发送中断信号给CPU,CPU再转而执行IO。
4.5.3.DMA方式
程序查询方式、程序中断方式,本质上都是CPU来管理IO,IO和内存之间想要传输数据,都必须通过CPU。无论如何进行优化,只要CPU参与了IO操作、内存读写操作,对于CPU来说都会有不小的时间浪费。
DMA的出现就是为了彻底将CPU从IO、内存之间的交互中拿掉。DMA方式中,主存和IO之间存在一条直接的数据通道,两者之间直接进行交互。DMA控制IO和内存交互的方式叫做——“周期窃取”,即一个IO周期中,从CPU手中获取到系统总线的使用权,沿用总线控制的方式来控制整个IO周期,这个周期内CPU对系统总线无使用权,但是并不意味着CPU就停下等待、无法工作。现代计算机系统中CPU有指令缓存器,一般会准备多条待执行指令,总线使用权被DMA窃取后,CPU可以继续执行后面的,不需要访存的指令。