您的位置:首页 > 运维架构 > Linux

Linux内核:IO设备通信的控制方式

2017-11-07 23:11 218 查看
IO设备与主机(CPU、内存)之间的通信不是直接的,而是通过设备控制器,设备控制器是IO设备和主机之间的中介。IO设备和进程之间的数据传送方式主要有4种:

1.程序控制方式:又被称为“忙等”模式,即当要在内存和IO设备之间进行信息传输时,由CPU向相应的设备发出命令,由设备控制器控制IO设备进行实际操作。在IO设备工作时,CPU执行一段循环测试程序,不断测试IO设备的完成状况,根据完成状况决定下一步操作。在此期间,CPU只能等待IO设备完成所有的数据传输,CPU和设备只能串行工作,并不能进行其他操作。

缺点:CPU计算和IO设备搬运数据二者任何时刻只能有一个活动,显然导致大量的资源被浪费掉,系统的性能可想而知。

2.中断控制方式:当前很多IO操作的主流设计思想,配合分时多任务系统的很自然的设计思想,CPU向相应的IO设备发出读写命令后,不必等待而转向执行其他进程,由设备控制器控制IO设备完成所有的实际操作,然后当前进程放弃对CPU的占用,进入休眠等待状态。

IO设备完成单次数据传输并会主动出发一次中断信号(单次传输数据量是设备控制器的数据缓冲寄存器的容量,如磁盘单次读取容量便是一个扇区,如果一次要读入一个磁盘块的大小数据,则需要中断2次…),通知CPU本次IO完成,然后CPU会将控制权转向中断处理程序,让其对此情况作出相应反应,以硬盘中断处理程序为例:

缺点:很明显,中断控制方式受限于设备的单次运输量,如果对于一次有较大数据需求的IO请求,则会在IO运行过程中被划分成若干的小块进行传输,中断次数很多,每次中断CPU都要运行中断处理程序,上下文环境的保存和恢复显然会让CPU耗费不少精力。

3.DMA方式:针对中断控制方式面对大量数据请求出现的中断次数过多的问题,可以增加硬盘配备的数据缓冲寄存器数量以增加单次搬运的数据量(但是这种做法仔细一想并非最优,一方面增加寄存器数量成本上升,另一方面若是对于小量数据请求,比如100KB,若增加硬盘的单次传输量为4MB,显然也是会造成时间浪费的,并且磁盘扇区、磁盘单次传输量、内存页帧这些参数是彼此对应的,牵一发动全身,不能乱改)。

故而DMA(direct memory access)设计思想就是配置一个DMA控制器,当存在单次大批量数据请求时,在内存和IO设备之间搭建直接沟通的桥梁,绕过操作系统为设备提供的缓冲池,省的在内存中二次搬运,由DMA控制器控制数据传输。

DMA工作方式:当某一进程提出一次单次大批量数据请求,则首先CPU规划好这批数据在进程的虚拟空间的位置,并事先完成虚拟内存到实际内存的映射关系(虚拟内存那端肯定是连续的堆空间,而实际内存这段操作系统一般也会尽可能在DMA区中划分出连续的实际内存空间以匹配),然后CPU将规划好的内存起始地址和size发送给DMA控制器中的内存地址寄存器和size计数器,然后由DMA控制器驱动硬盘驱动程序完成本次全部的IO请求,直到输入完成后,DMA控制器才发出中断信号告知CPU激活中断程序完成中断处理。

可以看到DMA的功能类似于包工头,指挥一群搬运工(单次磁盘驱动)向一个仓库(DMA连续内存段)批量完成搬运工作。但是DMA依旧不太智能,比如内存起始地址和搬运size等都需要CPU经过事先的规划,而且需要CPU自己去仓库提选合适数据。

缺点:DMA的运行过程可以看到对于内存的划分存在极强的连续性要求,虽然x86将0~16M的物理页面专门划分出来用于IO设备的DMA处理,但是显然这种方式对内存使用方式较为僵硬,整体的协调逻辑较为复杂)

4.通道控制方式:DMA控制方式虽然解决了批数据传输问题,但是CPU还是要费心对DMA进行指导和中断处理。为了提高计算系统的运行效率,CPU应该专职计算而非这些简单但是繁琐的IO事务,通道控制方式便是引入一个功能较为简单的协处理机,它可以接受CPU发来的IO命令,通道作为处理机也有自己的一套指令集,可以独立执行通道程序,对IO设备进行控制。

IO通道的指令集较为单一,因为通道的目的单一即为IO操作,故而硬件设计也简单(降低成本),所以能执行的命令主要局限于IO操作相关,此外通道并没有自己的内存,通道要执行的通道程序是放在主机内存中的,通道要和CPU共享内存。取自《操作系统原理及应用》教材的图用以演示通道的工作原理。



Fig.1 CPU和通道间的通信协同关系

可以看到通道相当于包工头+账房先生的合体,不仅负责搬而且负责简单的算,这种情况下,对于内存的连续性要求并没有DMA那么强了,“通道”先生可以知道在指定的内存位置存放指定的数据。

通道的引入使CPU可以专心计算,而把IO任务完全交给通道完成,二者各负其责。二者分工使得计算和IO操作可以并行,即CPU和设备并行工作,从而提高资源的利用率。而通道是直接负责IO设备的读取,故而根据负责的IO设备和调度方式不同可以做如下分类:

a. 字节多路通道:以字节为单位传输,可连接若干IO设备,按照时间片轮转方式分时执行;

b. 数组选择通道:以数组(多个字节)为单位传输,从而数据传输速率高,通常连接高速设备,如磁盘机。 这种通道以串行方式执行通道程序,独占使用;

c. 数组多路通道:相比于数组选择通道的独占串行方式,改成时间片轮转分时(并发执行多个通道程序)。



Fig.2 具有通道的I/O系统结构

对于Linux系统而言第2,3种IO控制方式是主流采用的,通道控制方式虽然更高效,但是由于需要添加专门的通道协处理器,故而成本较高,常用于专用场景。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息