IO设备时可以将数据输入到计算机或接受计算机输出数据的外部设备,属于硬件。UNIX系统会将外部设备抽象为一种特殊的文件,用户可以用和文件操作相同的方式对IO设备操作。
需要注意 IO 指输入和输出,更具体来说是输入到计算机 和 从计算机输出,而不是指输入到IO设备 和 输出到IO设备,因为这会有歧义,到底是从计算机输入到IO设备还是用户输入到IO设备。
一、 IO设备分类
按使用特性分为
交互设备:如鼠标键盘,传输速度慢;
存储设备:如磁盘,传输速度快;
网络设备:如网卡,介于两者之间。
按传输速率分为
低速设备:如鼠标键盘,速率为每秒几个到几千个字节。
中速设备:如打印机,每秒数千到上万字节。
高速设备:如磁盘,每秒数十到数百兆。
按信息交换单位分为
块设备:传输单位为块,块的大小为 1K、4K、16K等,可寻址,可随机读写任何一块。如磁盘。
字符设备:传输单位为字节或字符,不可寻址,采用中断驱动。如鼠标键盘。
二、IO系统分层
用户层功能:
用户层需要提供给用户IO操作相关的库函数对设备进行操作,如 read()/write()/print()等。用户层软件需要调用下层的系统调用委托内核操作设备。
设备独立软件:
A、为上层提供系统调用,将用户层的过程调用转为系统调用命令和参数。
B、设备保护(使用权限控制)。
C、差错处理。
D、设备的分配与回收(因为独占设备是临界资源,不能同时分配给多个进程使用,所以需要分配算法)。
E、数据缓冲区管理。
F、建立逻辑设备名到物理设备名的映射(系统调用的参数用逻辑设备而非物理设备名);根据设备名和类型选择相应的驱动程序。
G、IO调度。即用某种算法确定处理多个IO请求的顺序。
该层和设备无关,与设备的硬件特性 无关的功能(如设备命名、命名映射、设备分配和缓冲区管理等)几乎都在这一层实现。
设备驱动程序:
负责设备的具体控制,将上层发出的IO指令转为特定设备能识别的指令。驱动程序一般以一个独立进程的方式存在。
为什么不同设备需要不同的设备驱动程序?因为每个设备的具体功能和内部硬件特性都不同,如何操控这些设备只有出厂厂商知道,因此设备驱动程序是由厂商编程并刻到硬件中的。操作系统只负责让CPU执行这些驱动程序,但这些驱动程序不是操作系统内核代码的一部分。
中断处理程序
由设备发出,通知CPU已完成IO操作,让CPU执行中断处理程序,中断处理程序要做的事情如下
中断和驱动程序是直接和硬件打交道的。
硬件
执行具体IO操作。硬件包括 设备本身 和 IO控制器 两部分。
接下来将从下往上介绍每一层的细节。
三、IO控制器
IO设备包括机械部件和电子部件,电子部件是一块印刷电路板,也就是IO控制器。
CPU无法直接控制IO设备的机械部件,因此需要IO控制器作为中介完成CPU对设备的控制。
IO控制器功能
1、接收和识别CPU发出的命令,如CPU发出的read/write命令,IO控制器会有相应的控制寄存器来存放命令和参数。
2、向CPU报告设备状态,IO控制器由相应的状态寄存器记录IO设备的状态,如空闲、忙碌、读就绪、写就绪等。
3、数据在CPU和设备间交换,IO控制器会设置相应的数据寄存器,输出时暂存CPU发来的数据,然后控制器把数据传送到IO设备机械部件。输入时暂存设备发来的数据,之后CPU从数据寄存器种取走数据。
4、地址识别,为了区分控制器中的各个寄存器,需要给IO控制器的每个寄存器设置一个地址,IO控制器通过CPU提供的“地址”判断CPU要读写的是哪个寄存器。
IO控制器的组成
主要分为 CPU与IO控制器的接口、IO逻辑 和 控制器与设备的接口。
一个IO控制器可以连向多个设备,因此控制器与设备的接口可以有多个。
CPU与IO控制器的接口:该接口通过 数据线、地址线和控制线与IO逻辑和各种寄存器相连接。
IO逻辑:接收和识别CPU的各种指令,并向设备发出指令。
控制器与设备的接口: 用于实现控制器和设备之间的通信。
如下图:
由于一个IO控制器可以连向多个设备,因此IO控制器只有一个数据寄存器、控制寄存器和状态寄存器是不够的,每类寄存器会有多个。每个控制/状态寄存器对应一个具体的设备,每个寄存器都有一个地址供CPU操作。
IO控制器的寄存器编址
如何为IO控制器的寄存器编址?有两种方式:
1、用内存地址的一部分作为这些寄存器的地址,这种方式叫做 内存映像IO。
2、独立为寄存器编址,该方式叫做 IO专用地址。
对于内存映象IO,控制器中的寄存器和内存地址采用统一编址,地址在 0 ~ N-1的范围是内存地址,在 N~∞的范围是IO控制器的寄存器地址。
对于寄存器独立编址,控制器中的寄存器和内存地址是分开的,和内存地址无关的。使用独立编址的缺点是 需要设置专门的指令来实现对控制器寄存器的操作,要指明寄存器的地址,还要指明该寄存器所在的控制器的编号。
内存映象IO的优点是CPU可以使用操作内存的指令来操作控制器寄存器(如将CPU的数据寄存器内的数据或者某个内存地址的数据拷贝到某个控制器的数据寄存器)。
如下图:
四、IO控制方式
共四种:程序直接控制(CPU轮询)、中断驱动、DMA 和 通道控制。
我们关注每种方式下的:A 完成一次读写的流程、B CPU干预的频率、C 一次IO,数据传送的单位、D 数据的流向。
1、程序直接控制
流程:
A、 CPU通过控制线向控制器发出读指令;设备启动,状态寄存器设置为1(未就绪)。
B、 设备在完成IO之前,CPU轮询检查状态寄存器的状态标志位,直到状态寄存器的状态为读就绪。如果IO发生错误,也会在状态寄存器标注错误标志位。
C、输入设备准备好数据并传给控制器,报告自身状态为已就绪。
D、控制器将输入数据放到数据寄存器,并修改状态寄存器的对应标志位表示已就绪。
E、CPU发现设备读就绪,把数据寄存器中的数据读入CPU的数据寄存器,再拷贝到内存(因为这个数据背后的变量是指向内存的,同理输出的数据也要先放到内存,再从内存取出传输到控制器)。
F、如果数据未读完,CPU会继续发出读指令。也就是说,用户进程的一个读操作需要CPU发送多个读指令给控制器。
CPU干预频率
CPU在IO操作期间需要不断轮询,IO操作之后也要CPU干预(把数据从控制器拷贝到内存)。每个字节的读写都需要CPU的干预(轮询+拷贝到内存)
数据传输单位
每次IO 只传输一个字节。
数据流向
读操作(数据输入):IO设备->CPU寄存器->内存
写操作(数据输出):内存->CPU寄存器->IO设备
优缺点
实现简单,循环执行某个检查状态的指令即可。
CPU和IO设备只能串行工作,CPU轮询时处于忙等状态,利用率低。
2、中断驱动
由于IO设备的速度很慢,因此CPU发出IO命令后可以将等待IO的进程阻塞,然后切换到其他进程执行。
当IO完成后,控制器向CPU发出中断信号,CPU检测到中断会保存当前进程的运行环境信息,响应这个中断,再执行中断处理程序。
中断处理程序做的事是让CPU从IO控制器读一个字的数据到CPU寄存器(每次中断只接收一个字节),再写入到主存。之后,CPU唤醒和恢复等待IO的进程。
需要注意:
CPU会在每个指令周期的末尾检查中断,也就是每运行一条指令都会检查一次是否有中断信号到来(检查中断基于硬件,因此速度极快)。
中断需要保存进程的运行环境,需要一定的CPU时间开销,所以中断频率高会降低性能。
CPU干预频率
IO开始前,CPU介入发送指令。
IO完成后,中断让CPU从控制器中接收数据。
数据传送单位
每次IO一个字节。
数据流向
和“程序直接控制”相同。
优缺点
CPU可以在IO过程中执行其他进程,不同不停轮询,CPU和IO可并行工作;
每个字节的传输都需要中断,会消耗较多CPU时间在上下文保存。
CPU要参与数据从控制器拷贝到内存(或从内存拷贝到控制器)。
中断驱动的IO控制方式适用于字节设备。
3、DMA
DMA控制方式的IO控制器叫做 DMA控制器。
CPU要指明此次操作的具体参数如 读入多少数据,数据放入那个内存地址(因为数据拷贝到内存由DMA控制器完成),数据在外设的地址(因为DMA方式用于块设备的读写,而块设备的数据是有地址的,磁盘地址)。
DMA本质也是一种IO控制器,DMA控制器结构如下:
相比于普通的IO控制器,DMA控制器还多了2种寄存器:数据计数器 和 内存地址寄存器(因为DMA要完成数据从控制器拷贝到内存,因此需要知道目的内存地址)。
相比于普通的IO控制器,DMA控制器还需要将总线与内存连接。
DR (Data Register,数据寄存器):暂存从设备到内存,或从内存到设备的数据。
MAR (Memory Address Register,内存地址寄存器):在输入时,MAR 表示数据应放拷贝到内存中的什么 位置;输出时 MAR 表示要输出的数据从内存中的什么位置拷贝。
DC (Data Counter,数据计数器):表示剩余要读/写的字节数。
CR(Command Register,命令/状态寄存器):用于存放CPU发来的I/O命令,或设备的状态信息。
注意:DMA从磁盘中也是一个字一个字读入到DR寄存器,再一个字一个字拷贝到内存(内存的数据单位是字节),而不是一个块一个块读入DMA控制器。DMA从磁盘读满一个块才向CPU发出中断。
读写块设备时,CPU的一个指令可以读/写一个或者多个块,一个指令读多个块的条件是多个块在磁盘中是连续的,如果n个块是离散的,就要发出n个IO指令(读入到内存时也是连续的,如果要读入的多个块在磁盘中连续,但要离散的存到内存,也要发出n个IO)。同理一个指令写多个块的条件是多个块在内存中是连续的,如果n个块是离散的,就要发出n个IO指令。
CPU干预频率
仅在传送一个或多个数据块的开始和结束时需要CPU干预
数据传送单位
每次IO一个块(每一个块到达就发出一次中断)。
数据流向
读操作(数据输入):IO设备->内存
写操作(数据输出):内存->IO设备
优缺点
优点:数据传输以“块”为单位,CPU介入频率进一步降低。
数据的传输不再需要先经过CPU再写入内 存,数据传输效率进一步增加。
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。
如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要分别发出多条 I/O指令,进行多次中断处理才能完成。
4、通道控制方式
通道:一种硬件,可以理解为是 “弱鸡版的CPU”,因为通道和CPU一样可以执行指令,但只能执行IO指令,而且通道没有自己的内存,通道要执行的通道程序放在主机的内存,通道和CPU共享内存。
流程
A、CPU向通道发出I/O指令。指明通道程序在内存中的位置,并指 明要操作的是哪个I/O设备。之后CPU就切换到其他进程执行了。
B、通道执行内存中的通道程序(其中包含多个IO指令,指 明了要读入/写出多少数据,读/写的数 据应放在内存的什么位置等信息)。
C、通道执行完规定 的任务后,向CPU发 出中断信号,之后 CPU对中断进行处理。
通道与IO控制器连接,一个通道可以连接到多个IO控制器。
CPU干预的频率
极低,通道会根据CPU的指示执行相应的通道程序(包含多个IO请求,多个IO指令),只有完成一组(离散)数据块 的读/写后才需要发出中断信号,请求CPU干预。
数据传送的单位
每次读/写一组数据块
数据的流向(在通道的控制下进行)
读操作(数据输入):I/O设备 -> 内存
写操作(数据输出):内存->I/O设备
缺点和主要优点
缺点:实现复杂,需要专门的通道硬件支持
优点:CPU、通道、I/O设备可并行工作,资源利用率很高。
总结:
每一个阶段控制方式的 优点都是解决 了上一阶段的 最大缺点。 总体来说,整 个发展过程就 是要尽量减少 CPU对I/O过程 的干预,把CPU 从繁杂的I/O控 制事务中解脱 出来,以便更 多地去完成数 据处理任务。
如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息
张柏沛IT技术博客 > 操作系统入门(二十)IO系统之IO设备分类、IO系统分层、IO控制器、DMA和通道控制