5 输入输出管理
5.1 IO控制方式
程序直接控制
程序直接控制方式的运行流程
- 对读入的每个字,CPU都需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器中。
- 在程序直接控制方式中,由于CPU的高速性和I/O设备的低速性,致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成了CPU资源的极大浪费
- 在该方法中,在CPU之所以要不断的测试I/O设备的状态,就是因为在CPU中采用中断机构,使I/O设备无法向CPU报告他已完成了一个字符的输入操作。
--------------------------------------------------------------------------
程序直接控制方式的优点:简单易于实现
程序直接控制方式的缺点:由于CPU与I/O设备智能串行工作,导致CPU的利用率下降
中断驱动控制
中断驱动方式的思想是,允许IO设备主动打断CPU的运行并请求服务,从而"解放"CPU。与程序直接控制方式相比,不用程序经常循环去检查设备状态。这使得CPU向IO控制器发送读命令后可以继续做其他工作。
--------------------------------------------------------------------------
中断驱动控制方式的运行流程(IO控制器的角度)
- 【I/O控制器】从CPU接受一个读命令,然后从外围设备读数据
- 一旦数据读入该【I/O控制器】的【数据寄存器】,便通过【控制线】给CPU发出一个【中断信号】,表示数据已经准备好,然后等待CPU请求该数据
- IO控制器收到CPU发出的取数据请求后,将数据放到【数据总线】上,传到CPU的寄存器中,一次IO操作完。
从CPU的角度来说
- CPU发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器和处理机寄存器),转去其他程序。
- 在每个指令周期末尾,CPU需要检查中断
- 当有来自【I/O控制器】的中断时,CPU保存当前正在运行程序的上下文,转去执行中断处理程序,以处理该中断
- 这时,CPU从I/O控制器读一个字的数据传送到寄存器,并存入主存。
- 当数据接收完毕,CPU恢复发出I/O命令的程序(或其他程序)的上下文,然后继续运行。
--------------------------------------------------------------------------
中断驱动控制的优点:比程序直接控制方式更有效
中断驱动控制的缺点:由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多时间。
DMA方式
DMA方式就是在I/O设备和内存之间开辟直接的数据交换通道。DMA方式的特点有:
- 基本单位时【数据块】
- 传送的数据是从设备直接送入内存的,或者相反
- 仅在传送一个或多个数据的【开始】和【结束】时,才需要CPU的干预,整块数据的传送是在DMA控制器的控制下完成的
--------------------------------------------------------------------------
DM控制器中的4类寄存器:
- 命令/状态寄存器CR
- 内存地址寄存器MAR
- 数据寄存器DR
- 数据计数器DC
--------------------------------------------------------------------------
DMA方式的运行流程是:
- CPU接收到IO设备的DMA请求,它给IO控制器发出一条命令,启动DMA控制器,然后继续其他工作
- 之后CPU把控制操作委托给DMA控制器了,由DMA控制器负责处理数据的传输
- DMA控制器直接与存储器交互数据,传送整个数据块,【每次传送一个字】,这个过程不需要CPU参与
- 传送完毕后,DMA控制器发送一个中断信号给处理器
--------------------------------------------------------------------------
DMA方式与中断驱动方式的区别是:
- 中断驱动方式在【每个数据】需要传输时中断CPU;而DMA控制方式则是在所要求传送的【一批数据全部传送结束】时才中断CPU。
- 中断驱动方式传送时是在中断处理时由【CPU】控制完成的;DMA方式传送则是由【DMA控制器】控制完成的
- 中断驱动方式数据传送通过【软件】完成,DMA方式数据传送通过【硬件】完成
- 中断响应发生在一条【指令执行结束后】,DMA响应发生在一个【总线事务完成后】
通道控制方式
IO通道是指专门负责输入/输出的处理机。使用IO通道可以进一步减少CPU的干预,即把对一个数据块的读/写为单位的干预,减少为对一组数据块的读/写及相关控制和管理为单位的干预。同时又实现CPU、通道和IO设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
--------------------------------------------------------------------------
IO通道的运行流程是:
- 当CPU要完成一组相关的读/写操作及有关控制时,只需向IO通道发送一条IO指令,以给出其所要执行的通道程序的【首地址】和要【访问的IO设备】
- 通道接收该指令后,执行通道程序即可完成CPU所指定的IO任务,数据传输结束时向CPU发送【中断请求】
--------------------------------------------------------------------------
【IO通道】与【一般处理机】的区别:【通道指令】的类型单一,没有自己的内存,通道所执行的通道程序是放在主机内存中的,也就是说通道与CPU共享内存。
【IO通道】与【DMA方式】的区别:【DMA方式】需要CPU来控制传输的数据块大小、传输的内存位置,而【通道方式】中这些信息都是通道控制的;【DMA方式】中每个DMA控制器对应一台设备与内存传递数据,而【一个通道】可以控制多台设备与内存交换信息。
IO子系统的层次结构
重点在前面4个 :用户级IO软件、设备独立性软件、设备驱动程序、中断处理程序
用户层IO软件:实现与用户交互的接口
设备独立性软件:实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备的分配与回收
设备驱动程序:与硬件直接相关,具体负责系统对设备发出的控制操作指令
中断处理程序:用于处理中断等相关事宜
硬件设备:包括一个机械部件(设备本身)和一个电子部件(控制器)
5.2 IO核心子系统
IO核心子系统提供的主要服务有:IO调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等
IO调度
IO调度等概念:确定一个好的顺序来执行这些IO请求。用队列实现调度,即出现阻塞时,IO系统调用
缓冲与高速缓存
磁盘高速缓存:在内存中开辟一个 单独的存储空间作为磁盘高速缓存,但是这个空间大小固定;把未用到的内存空间(这个空间是灵活的)作为一个缓冲地,供请求分页系统和磁盘IO时共享(比如Cache)。
缓冲区有:单缓冲、双缓冲、循环缓冲、缓冲池。
--------------------------------------------------------------------------
单缓冲:在设备与处理机之间设置【一个】缓冲区,设备与CPU交互数据时,先把被交换的数据写入缓冲区,然后需要需要数据的设备或CPU从缓冲区中取走数据。
单缓冲的用时为 M a x ( C , T ) + M Max(C,T)+M Max(C,T)+M,C为CPU对一块数据处理的时间,T为数据把一块数据输入到缓冲区的时间,M为数据传送到用户区(工作区)的时间。解释一下:工作区未处理完数据,但此时磁盘已经把一块数据输入到缓冲区中(取最大值C);工作区已经处理完毕,但磁盘尚未完成把一块数据输入到缓冲区中(取最大值T)。
双缓冲:在设备与处理机之间设置【两个】缓冲区,只有一个缓冲区填满时,在会启动另一个缓冲区。然后被填满的缓冲区向处理机传送数据。
双缓冲区的用时为Max(C+M,T),C为CPU对一块数据处理的时间,T为数据把一块数据输入到缓冲区的时间,M为数据传送到用户区(工作区)的时间。解释一下:一个缓冲区中的数据传到了工作区且被处理完毕,磁盘尚未把数据写入(取最大值T);一个缓冲区的数据尚未完成传到工作区且被处理完毕,但此时磁盘已经把数据写入(取最大值C+M)
循环缓冲:包含多个大小相等的缓冲区,每个缓冲区中有一个链表指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形
在进行输入输出时,还需要两个指针in和out,in指针指向可以输入数据的第一个空缓冲区,out指针指向可以输出数据的第一个满缓冲区
缓冲池:由多个系统共用的缓冲区组成,缓冲区安使用状况分为三个队列
--------------------------------------------------------------------------
高速缓存与缓冲区的对比
相同点:都介于高速设备与低速设备之间
高速缓存于缓冲区存放数据的区别
- 【高速缓存】存放的都是低速设备上的某些数据的复制数据,即高速缓存上有的,低速设备上必然也有
- 【缓冲区】存放的是低速设备传递给高速设备(或方向相反)的数据,而这些数据在低速设备(或高速设备)上不一定有备份,这些数据再从缓冲区送到高速设备(或低速设备)
高速缓存和缓冲区目的的区别
- 【高速缓存】存放是高速设备经常要访问的数据,若高速设备访问的数据不在高速缓存中,则高速缓存要访问低速设备,就如同CPU访问Cache一样,如果未命中Cache中的数据块,则需要访问主存
- 【缓冲区】的目的是高速设备和低速设备都要经过缓冲区,高速设备永远不会访问低速设备
设备分配与回收
设备的分类
- 独占式使用设备:设备被使用时不再允许其他进程使用该设备(比如打印机),一般采用【静态分配】
- 分时共享使用设备:设备没有独占使用的要求时,可以通过分时共享使用(比如磁盘),一般采用【动态分配】
- SPOOLing技术:将独占设备改造为共享设备,对IO操作的批处理(以空间换时间)
分享的原则:既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开
【注意】设备分配程序为用户进程分配设备的过程通常是:先分配设备,再分配设备控制器,最后分配通道
设备分配的算法:先来先服务、优先级高的优先
分配方式
- 静态分配:在用户作业开始执行前,由系统一次性分配改作业所要求的全部设备
- 动态分配:在进程执行过程中,根据执行需要进行分配(有死锁的风险,通过系统调用命令向系统提出请求)
设备分配依据的主要数据结构:设备控制表DCT、控制器控制表COCT、通道控制表CHCT、系统设备表SDT
- 设备控制表DCT:一个设备控制表就表征一个设备
- 设备控制表DCT与控制器控制表COCT有一一对应关系;COCT控制器控制表与通道控制表CHCT有一多对应关系
- 系统设备表SDT:整个系统就一张设备控制表SDT
分配时主要考虑的因素:IO设备的固有属性,IO设备的分配算法,IO设备分配的安全性、IO设备的独立性
假脱机(SPOOLing技术)
脱机技术就是利用专门的外围控制机,将低速IO设备上的数据传到高速磁盘上。SPOOLing的意思是外部设备同时联机操作,又称假脱机。所谓"脱机"指的是——脱离用户的控制进行的输入/输出操作,缓解CPU与IO的速度矛盾。
SPOOLing需要外存的支持(也就是输入井和输出井存放的位置),需要多道程序设计技术的支持(如果没有多道程序,那么CPU与设备就是串行,无所谓是不是使用SPOOLing技术),可以让多个作业共享一台独占设备(逻辑上共享,微观上还是串行),由【系统】控制设备与输入井/输出井之间的数据传送。
输入井:模拟脱机输入时的磁盘,用于收容IO设备输入的数据。也就是低速设备给CPU输入数据时,先 把数据输入到磁盘。数据准备完毕后,再 由磁盘把数据一次性输入到主存,这里CPU就不需要再等待低速设备输入数据,而可以暂时把进程挂起去做其他时期。
输出井:模拟脱机输出时的磁盘,用于收容用户程序的输出数据。比如一项打印操作,CPU要将打印机输出要打印的数据,打印机的打印速度慢,CPU就必须迁就打印机,在打印机完成打印操作后,CPU才会做其他事情,浪费CPU时间。而使用SPOOLing技术下,CPU将要打印的数据先输入到磁盘中的输出井中,然后去做其他事情。若此时打印机被占用,SPOOLing系统就会把这个打印请求挂在打印请求队列上,待打印机有空时再把数据打印出来。整个过程CPU可以做其他事情。
户程序的输出数据。比如一项打印操作,CPU要将打印机输出要打印的数据,打印机的打印速度慢,CPU就必须迁就打印机,在打印机完成打印操作后,CPU才会做其他事情,浪费CPU时间。而使用SPOOLing技术下,CPU将要打印的数据先输入到磁盘中的输出井中,然后去做其他事情。若此时打印机被占用,SPOOLing系统就会把这个打印请求挂在打印请求队列上,待打印机有空时再把数据打印出来。整个过程CPU可以做其他事情。
SPOOLing的主要特点:提高了IO的速度;将独占设备改造为共享设备,实现了虚拟设备的功能