I/O管理概述
I/O设备分类
按 数据组织/信息交换的单位 分类:
- 块设备:传输快,可寻址
- 字符设备:传输慢,不可寻址,常采用中断驱动方式
按资源分配:
- 独占式设备:只允许各个进程串行使用。如打印机
- 共享设备:允许多个进程同时使用(微观上交替使用)。如硬盘
- 虚拟设备:在一类设备上模拟另一类设备,常用的方法是,用共享设备模拟独占设备,用高速设备模拟低速设备。如:用Spooling技术将打印机变成共享设备。
按用途分类:
- 存储设备:磁盘、磁带;
- 传输设备:网卡,Modem;
- 人机交互设备:显示器、键盘、鼠标。
I/O管理示意
- 逻辑I/O :完成设备无关的操作,如设备分配,设备回收,数据准备等;
- 设备驱动程序:负责对设备控制器进行控制(通过读写其中的寄存器)。
- 中断服务程序:设备工作结束后负责向 CPU 发中断信号,中断服务程序完成相应处理。
I/O硬件组成
设备控制器
功能
- 接受和识别CPU命令:用控制寄存器
- 数据交换:在CPU与控制器、控制器与设备之间,用数据寄存器
- 设备状态的了解和报告:用状态寄存器
- 设备地址识别:识别CPU要读写哪个寄存器,要实现I/O地址(见下“I/O端口地址”)
- 缓冲区
- 对设备传来的数据进行差错检测
组成
控制器与CPU接口:数据寄存器、控制寄存器、状态寄存器,采用内存映射或专门的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专用指令:Intel体系架构in/out指令
优点:
- 外设不占用内存的地址空间
- 编程时易于区分是对内存操作还是对I/O操作
缺点:I/O端口操作的指令类型少,操作不灵活
I/O控制方式!
程序控制I/O(PIO,Programmed I/O)
CPU轮询检查状态寄存器
中断驱动方式(Interrupt-driven I/O)
- CPU发出读/写命令后,将等待I/O的进程阻塞,切换到其他进程。
- 当I/O完成后,设备控制器向CPU发出中断信号。
- CPU在每个指令周期的末尾检查中断,若检测到中断信号,则保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。
- 处理中断的过程中,CPU从控制器读一个字的数据传送到CPU寄存器,再写入主存
- CPU恢复等待I/O的进程的运行环境,继续执行
直接存储访问方式(DMA, Direct Memory Access)
主要用于块设备的I/O控制,不再一个字一个字传送,但是块必须是连续的。CPU仅在传送开始和结束时进行干预,I/O设备与内存可以直接交互,不需要经过CPU
过程:
由程序设置DMA控制器中的若干寄存器值(如内存始址,传送字节数),然后发起I/O操作;
DMA控制器完成内存与外设的成批数据交换;
在操作完成时由DMA控制器向CPU发出中断
DMA控制器和I/O控制器类似,有如下寄存器:
- 命令/状态寄存器(CR):用于接收从CPU发送来的I/O命令,或有关控制信息,或设备的状态。
- 内存地址寄存器(MAR):在输入时,它存放把数据从设备传送到内存的起始目标地址,在输出时,它存放由内存到设备的内存源地址。
- 数据寄存器(DR):用于暂存从设备到内存,或从内存到设备的数据。
- 数据计数器(DC):存放本次CPU要读或写的字(节)数。
优点:
CPU只需干预I/O操作的开始和结束,而后续成批的数据读写则无需CPU控制,适于高速设备。
缺点:
- 数据传送的方向、存放数据的内存地址及传送数据的长度等都由CPU控制,占用了CPU时间。
- 每个设备占用一个DMA控制器,当设备增加时,需要增加新的DMA控制器
区别 | 中断驱动 | DMA |
---|---|---|
何时中断? | 每个单位数据传送完成后中断CPU | 传送的一批数据完成后中断 |
谁控制数据传送? | CPU控制完成数据传送,涉及程序切换,需要保护和恢复现场 | 由DMA控制器控制完成的,在传输过程中不需要CPU干预,DMA控制器直接在主存和I/O设备之间传送数据,只有开始和结束才需要CPU干预 |
具有对异常事件的处理能力 | 适用于数据块的传输 |
通道技术(Channel)
I/O通道是专门负责输入输出的处理器,独立于CPU。
与DMA的原理几乎是一样的,通道是一个特殊功能的处理器,它有自己的指令和程序专门负责数据输入输出的传输控制。CPU将“传输控制”的功能下放给通道后只负责“数据处理”功能。这样,通道与CPU分时使用内存,实现了CPU内部运算与I/O设备的并行工作
区别 | DMA | 通道 |
---|---|---|
数据的传送方向、存放数据的内存起始地址和数据块长度都由CPU控制 | 是一个特殊的处理器,有自己的指令和程序,通过执行通道程序实现对数据传输的控制,所以通道具有更强的独立处理I/O的功能 | |
通常只能控制一台或者少数几台同类设备 | 一个通道可同时控制多种设备 |
I/O软件组成
逻辑设备表LUT(Logical Unit Table)
为了实现设备的独立性,系统必须设置一张逻辑设备表,用于将应用程序中所使用的逻辑设备名映射为物理设备名。
该表的每个表目中包含了三项,逻辑设备名(设备类型)、物理设备名、设备驱动程序的入口地址
I/O缓冲管理
I/O设备管理
数据结构
通道可以有多个,一个通道管理多个控制器,一个控制器管理多个设备
设备控制表DCT
每个设备一张DCT,用于记录设备情况
- 设备队列队首指针:凡因为请求本设备而未得到满足的进程,其PCB都应按照一定的策略排成一个队,称该队列为设备请求队列或简称设备队列,其队首指针指向队首PCB;
- 设备状态:当设备处于使用状态时,应该把设备忙/闲标志置为1;
- 控制器表指针:该指针指向该设备所连接的控制器的控制表;
- 重复执行次数:外部设备在传送数据时,较容易发生数据传送错误。在许多系统中,如果发生传送错误,并不立即认为传送失败,而是令它重传,并由系统规定设备在工作中发生错误时应重复执行的次数
控制器控制表CCT
通道控制表CHCT
系统设备表SDT
记录了系统中全部设备的情况,每个设备对应一个表目
假脱机技术(SPOOLing技术)
用户空间的I/O软件
也称为虚拟设备技术,可把独享设备转变成具有共享特征的虚拟设备,从而提高设备利用率
SPOOLing程序和外设进行数据交换:实际I/O
- SPOOLing程序预先从外设读取数据并加以缓冲,在以后需要的时候输入到应用程序
- SPOOLing程序接受应用程序的输出数据并加以缓冲,在以后适当的时候输出到外设
应用程序和SPOOLing程序交换数据:虚拟I/O
应用程序进行I/O操作时,实际上是从SPOOLing程序的缓冲池中读出数据或把数据送入缓冲池,而不是跟实际的外设进行I/O操作
I/O性能问题
两个途径
- 使CPU利用率尽可能不被I/O降低:可以使用缓冲技术减少或缓解速度差异,同时使用异步I/O使CPU不等待 I/O
- 使CPU尽可能摆脱I/O:使用DMA、通道等I/O部件让CPU摆脱I/O操作的影响
I/O操作的两个步骤
- 把磁盘数据装载进内核的内存空间
- 把内核内存空间的数据copy到用户内存空间中
五种模型
- 阻塞I/O:指I/O调用结果返回之前,当前进程会被挂起(进入睡眠状态) ,只有在得到返回结果后, 才能继续执行。
- I/O多路复用:进程调用一个管理I/O的特殊库函数,此库函数可以接受并管理多个I/O请求,进程则可以同时等待多个I/O请求,可以提高效率。第二阶段依然需要工作进程参与库函数把内核空间数据复制到用户空间,第二阶段依旧阻塞
- 非阻塞I/O:进程发起I/O调用,I/O自己知道需过一段时间完成,就立即通知进程进行别的操作,则为非阻塞I/O
- 事件(信号)驱动I/O:进程发起调用,通过回调函数, 内核会记住是哪个进程申请的,一旦第一阶段完成了,就可以向这个进程发起通知,这样第一阶段就是非阻塞的,进程不需要忙等了, 但是第二阶段依然是阻塞的
- 异步I/O:无论第一第二段, 不再向系统调用提出任何反馈, 只有数据完全复制到服务进程内存中后, 才向服务进程返回ok的信息,其它时间,进程可以随意做自己的事情,直到内核通知ok信息