I/O硬件原理
I/O软件原理
缓冲技术
驱动调度技术
设备分配
虚拟设备
Linux设备管理
I/O控制方式分类(优化CPU与设备的并行性)
- 轮询方式:CPU全称参与I/O操作
- 中断方式:减少CPU参与工作量
- DMA方式:消除CPU的参与
- 通道方式:消除CPU的参与
轮询
举例:CPU从设备读入一批数据
CPU程序设置交换字节数和读入内存的起始地址
向设备发送查询指令
设备控制器把状态返回CPU
如果忙或未就绪,重复测试过程,继续查询
否则,开始数据传送,CPU从I/O接口读取一个字并保存到内存
如果传送尚未结束,继续发查询指令,直到全部传输完成
中断方式
CPU与设备间数据传输过程
进程发出启动I/O指令,CPU加载控制信息到设备控制器寄存器,然后
进程继续执行不涉及本次I/O数据的任务,或
放弃CPU等待设备操作完成
设备控制器检查状态寄存器
按照I/O指令要求,执行相应I/O操作(如将数据读入I/O缓冲寄存器)
一旦传输完成,设备控制器通过中断请求线发出I/O中断信号
CPU收到并响应I/O中断后,转向执行该设备的I/O中断例程
中断处理例程执行数据读取操作,将I/O缓冲寄存器的内容写入内存
操作结束后退出中断处理程序,返回中断前的执行状态
进程调度程序在适当时刻恢复得到数据的进程执行
直接存储器存取(Direct Memory Access,DMA)
I/O设备能直接与内存交换数据而不占用CPU
内存和设备之间有一条数据通路,成块地传送数据,无须 CPU 干预,实际数据传输操作由DMA直接完成
1、中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。
2、DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。DMA方式不需CPU干预传送操作,不占用CPU任何资源, 整个数据传输操作在一个称为”DMA控制器”的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。中断方式是程序切换,每次操作需要保护和恢复现场,中断次数多,CPU需要花较多的时间处理中断,中断次数多也会导致数据丢失。但是DMA是必须利用中断的,否则CPU无法得到数据已经传输结束,当数据传输开始结束的时候,需要给CPU一个中断信号,CPU进行处理.这个就大大的节约了CPU的资源。
3、中断方式的数据传送方向是由设备到CPU再到内存,或者相反。
DMA方式的数据传送则是将所传输的数据由设备直接送入内存,或是由内存直接送到设备
主机、通道、控制器和设备之间采用四级连接,实施三级控制
- 连接:一个CPU通常可以连接若干通道,一个通道可以连接若干控制器,一个控制器可以连接若干设备
- 控制:CPU通过执行I/O指令对通道实施控制,通道通过执行通道命令对控制器实施控制,控制器发出动作序列对设备实施控制,设备执行相应I/O操作
基于通道的I/O操作过程
- CPU在执行主程序时遇到I/O请求,启动指定通道上选址的设备
- 一旦启动成功,通道开始控制外围设备进行操作
- CPU可执行其他任务并与通道并行工作,直到I/O操作完成
- 通道发出操作结束中断时,CPU才停止当前工作,转向处理I/O操作结束事件
I/O中断处理程序
I/O设备驱动程序
独立于设备的操作系统I/O软件
用户空间的I/O软件
设备都被看做文件,通过路径名来寻址
保护对设备的授权访问
- 绝对禁止用户进程直接访问I/O设备
- I/O指令是特权指令,通过系统调用间接地供用户使用
设备文件依赖于inode来实现
- 文件目录不能区分文件名代表磁盘文件还是设备文件,但inode的内容不同
- 磁盘文件的inode包含指向数据块的指针
- 而设备文件的inode则包含指向内核设备驱动程序的指针,用来控制设备的I/O操作
进程对已打开文件的文件描述符执行读系统调用
独立设备I/O软件检查参数正确性
若正确,检查高速缓存中有要读的信息块,从缓冲区直接读到用户区,完成I/O请求
若数据不在缓冲区,执行物理I/O,实现将设备逻辑名转换成物理名
检查对设备操作的权限,将I/O请求排队,阻塞进程且等待I/O完成
内核启动设备驱动程序
分配存放读出块的缓冲区,准备接收数据
且向设备控制寄存器发启动命令,或建立DMA传输,启动I/O
设备控制器操作设备,执行数据传输
当采用DMA控制器传输数据时,一块传输完成,硬件产生I/O结束中断
CPU响应中断,转向中断处理程序
检查中断原因及设备执行状态
若设备有错,向设备驱动程序发送信号,检查是否能否重复执行
如果允许,重发启动设备命令
否则向上层软件报告错误
若设备I/O正确完成,将数据传输到制定的用户进程空降,唤醒阻塞进程,随后检查有无I/O请求排队
若有再启动设备,继续传输
当应用进程被再次调度执行时,从I/O系统调用的断点恢复执行
缓冲技术
从磁盘把一块数据读至缓冲区,假设花费时间T
把缓冲区数据送到用户区,设所消耗的时间为M
应用进程对这批数据进行计算,共耗时C
- 单缓冲
- 不采用缓冲技术,数据直接从磁盘传送到用户区,每批数据处理时间约为T+C
- 而采用单缓冲,每批数据处理时间为max(C, T)+M
- 通常M远远小于C或T,故速度会快很多
- 两块并列的缓冲
- C<T。单块数据的传输和处理时间为T(即max(C, T))。由于M远小于T,在将磁盘上的一块数据传送到缓冲区期间,计算机已完成将另一个缓冲区中的数据传送到用户区并对这块数据进行计算的工作
- 如果C>T,当上一块数据计算完毕后,需把一个缓冲区中的数据传送到用户区,花费时间为M,再对这块数据进行计算,花费时间为C。单块数据的传输和处理时间为C+M、即max(C,T)+M,此时进程不必要等待I/O
多缓冲
- 操作系统从内存区域中分配一组缓冲区组成循环缓冲
- 每个缓冲区的大小等于物理记录的大小
多缓冲的缓冲区是系统的公共资源,可供各个进程共享,并由系统统一分配和管理
访问磁盘上的一条物理记录,必须给出3个参数:柱面号、磁头号、扇区号
磁盘机根据柱面号控制移动臂作横向机械移动,带动读写磁头到达指定柱面,该动作执行速度较慢,称为“查找时间”。下一步选择磁头号,然后,等待被访问的扇区旋转到读写磁头下时,按扇区号存取信息,称为“搜索延迟”
访问磁盘涉及到了调度
- 选择柱面:读写头的移动
- 选择扇区:等待磁盘转到位置
移臂调度有若干策略
先来先服务算法
最短查找时间优先算法
扫描算法
分步扫描算法
将 I/O 请求分为长度为N的子队列,按FIFO算法依次处理各子队列
每个子队列内采用扫描算法,处理完一个后再服务下一个子队列,以避免出现磁臂粘住现象
电梯调度算法
没有请求的不动
有请求的向最近的移动,知道当前的方向没有,如果反向有就反向。
循环扫描算法
设置缓冲区加快磁盘IO
- 提前读
- 对于采用顺序方式所访问的文件数据,提前把下一磁盘块的数据也读入磁盘缓冲区
- 延迟写
- 考虑到此缓冲区中的数据不久之后会再次被进程访问,将修改后的内容挂在空闲缓冲区队列末尾
- 直至移动到空闲缓冲区队列之首,当再有进程申请缓冲区且分配到此缓冲区时,才把其中的数据写到磁盘上
- 虚拟盘
- 用内存空间去仿真磁盘,又叫RAM盘
- 虚拟盘vs.数据缓冲区高速缓存:前者的内容完全由用户控制,而后者的内容由操作系统控制
Linus电梯I/O调度算法(Linux 2.4)
如果I/O请求队列中已存在一个对相邻磁盘扇区操作的请求,新I/O请求将和这个已经存在的请求合并成一个I/O请求
如果I/O请求队列中存在一个驻留时间过长的请求,新I/O请求将被插入到队列尾部,以防止其他旧I/O请求发生饥饿
如果I/O请求队列中以扇区方向为序存在合适的插入位置,新I/O请求被插入到该位置,保证队列中I/O请求是以被访问磁盘物理位置为序进行排列的
如果I/O请求队列中不存在合适的I/O请求插入位置,新I/O请求将被插入到队列尾部
时限调度算法 (Linux 2.6)
加入了读写队列,设置时间阈值,如果读写队列里的长期不得到相应就从读写队列里开始做
预期I/O调度算法(Linux 2.6)
处理读请求的时候延迟一些,看看相应的程序会不会发出相近区域的请求,如果没有就是使用时限算法
公平排队I/O调度算法
每一个进程都有自己的请求队列,内部进行合并和插入,排序
然后轮转调度每一个队列,拿出若干请求进行处理
设备独立性:
- 用户与物理的外围设备无关
- 系统增减或变更外围设备时程序不必修改
- 易于对付输入输出设备的故障
- 用户利用逻辑设备进行I/O操作,逻辑设备与物理设备之间的转换由系统命令或语言来实现
独占方式:作业执行依赖独占设备(如卡片机)
静态分配,作业执行前将所要使用的设备全部分配给它
共享方式:执行过程中临时需要共享设备(如打印机)
动态分配,作业执行过程中动态分配设备资源
虚拟方式:如磁盘
不需要显式分配,设备管理的主要工作是驱动调度和实施驱动
静态分配的效率低,所以加上了磁盘作为缓冲,也就是可以做到不直接和输入输出交互(预输入和缓输出)