操作系统(五)——I/O管理
I/O管理主要通过对设备状态跟踪对设备存取数据、设备分配、及设备控制进行管理。
(一)I/O管理概述
1. I/O设备分类
印象中的I/O设备可能有,键鼠、打印机,但它们只是I/O设备中的一部分,在计算机中的磁盘、光盘以及用于网络连接的各类接口同样也是属于I/O设备。
image.png
2. I/O控制方式
外部设备输入输出的数据都需要存放在内存上,再传递给用户,而这个过程需要CPU的参与,根据CPU参与程度不同,可以分为4种控制方式:程序直接控制方式、中断驱动方式、DMA方式和通道方式。
-
程序直接控制方式:计算机从外设读取数据到寄存器,每次只读一个字的数据,对于每个字节,CPU都要进行循环检查,直到确定该字已经读到I/O控制器的数据寄存器中。
image.png -
中断驱动方式:在程序直接控制方式中,CPU循环检查数据是否读入,而中断驱动方式中,将CPU循环检查工作交给I/O控制器完成,CPU只需给I/O控制发送读命令,就可以去执行其他指令,由I/O控制器自行将数据读到数据寄存器中,完成读取任务后给CPU发出中断指令。当CPU接收到中断指令,便保存当前正在运行程序的上下文,去执行该中断,将I/O控制器中的数据送到寄存器,并存入到主存。
-
DMA方式:中断驱动方式每完成数据读取工作,都要打断CPU,由CPU将数据传输到主存。DMA方式则优化这一过程,直接由DMA控制器把数据传输到主存中去。CPU只在传输数据块的开始和结束时才进行干预。
image.png
工作流程:
image.png
- 通道方式:DMA方式在工作流程上大幅度释放CPU,但是这种方式还需要CPU来控制传输的数据块大小、传输的内存位置,为了将CPU从这些繁琐的工作中释放处理,有了通道方式。I/O通道是专门负责输入输出的处理机,当CPU要完成一组读写操作时,只需要给I/O通道发出一条I/O指令,给出要执行的通道程序的首地址和要访问的I/O设备,通道接收到该指令后,执行完I/O任务,也就是完成数据传输,才给CPU发送中断请求。
3. I/O层次结构
数据从用户到设备并不是一步完成,中间需要通过几层结构,这样不仅可以保持用户应用独立性,也有方便屏蔽一些系统内部细节。
image.png
设备控制器的工作流程:
- 用户读取某设备内容 -> 使用操作系统提供的read命令接口 -> 解析read命令 (应用软件和设备独立软件)
- 根据设备不同,将read命令解析成不同的指令 (设备驱动)
- 命令解析完毕 -> 发出中断 -> 设备控制器执行read命令 (中断处理程序)
- 硬件设备上的控制器根据上层命令操作硬件设备
(二)I/O核心子系统
由于常用设备繁多,需要为不同设备提供不同的控制方法,这往往会增加I/O管理的工作量,因此将一些公用操作或常用操作组成一个子系统,这些操作有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机及设备保护和差错控制等。
1. I/O调度
当有多个设备需要对计算机进行读写数据时,需要为这些设备提供请求队列实现调度,设备不同,使用的调度实现的方式略有不同,常见的调度算法是的磁盘调度算法。
image.png2. 缓冲区
I/O读写速度远慢于CPU处理速度,为了解决速度不匹配的问题,采用缓存方法。
常见的缓存是磁盘高速缓存,是磁盘与内存之间的缓存区域,它位于内存,要么从内存开辟一块单独的固定区域作为缓冲,要么是把没有利用到的内存作为一个缓冲池。
设备缓存区的缓冲区也位于内存区域,它的特点是:当缓存区的数据非空时,不能往缓冲区内冲入数据,只能从缓冲区内把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但只能在缓存区充满后,才能从缓冲区把数据传出。
根据缓冲区个数不同可以分为:单缓冲、双缓冲、循环缓冲和缓冲池。
2.1 单缓冲
单缓冲的缓冲区域位于设备与处理机之间,当设备与处理机交换数据时,先把被交换的数据写入缓冲区,然后需要数据的设备或者处理机再从缓冲区内取数据,先输入再输出。
image.png
输入时间(T),处理数据时间(C),传送数据时间(M)
- 当T>C时,单缓冲区处理每块数据的时间为M+T;
- 当T<C时,单缓冲区处理每块数据的时间为M+C;
2.2 双缓冲
单缓冲方式存在等待方,为了提供读取数据效率,采用双缓冲,两个缓冲区域可以并行工作,当其中一个被处理机读取数据时,另一个由设备向缓冲区输入数据。
image.png输入时间(T),处理数据时间(C),传送数据时间(M)
缓冲区处理一块数据的用时为:max(C+M, T)
2.3 循环缓冲
循环缓冲是将缓存区域划分为大小相当的多个缓冲区域块,每个缓冲区域块都有指向下一个缓冲区块的指针,此外还有in和out两个指针分别用于数据输入和输出。
每次输入时使用in指针向可以输入数据的第一个空缓存区输入,而要读取数据时,使用out指针从第一个满的缓冲区提取数据。
2.4 缓冲池
缓存池里有多个缓存区,这些缓存区根据它们的使用情况分为了三个队列:空缓冲队列、装满输入数据的缓存队列(输入队列)和装满输出数据的缓冲队列(输出队列)。
image.png- 输入数据时:空缓存队列的队首摘下空缓冲区 -> 在hin区输入数据 -> 输满后挂到输入队列队尾;
- 计算进程输入数据时:从输入队列提取缓冲区块 -> 在sin区提取数据 -> 数据用完后挂入空缓存队列;
- 计算进程输出数据时:空缓存队列的队首摘下空缓冲区 -> 在hout区输入数据 -> 输满后挂到输出队列队尾;
- 输出数据时:从输出队列提取数据 -> 在sout区提取数据 ->数据用完后挂入空缓存队列;
3. 设备分配
CPU根据用户的I/O请求分配设备,并且尽可能将设备忙碌,又要避免因设备分配不合理造成进程死锁。因此使用记录表记录每个设备分配情况,并且制定相应的分配策略,保证设备能够安全使用避免死锁发生。
3.1 设备分配的数据结构
进程管理使用PCB管理进程,文件管理使用FCB管理文,同样设备管理也需要建立类似的表管理设备,但是由于设备读写涉及到操作系统、控制器和通道,因此需要建立多个表,依次有系统设备表(SDT)、设备控制表(DCT)、控制器控制表(COCT)和通道控制表(CHCT)。
- SDT:整个系统只有一张,用于记录系统中全部设备的情况,是系统范围的数据结构;
- DCT:每个设备一张,记录本设备的情况;
- COCT:每个控制器一张,记录本控制器的情况;
- CHCT:每个通道一张,记录通道情况。
它们之间通过如下顺序依次进行访问:
SDT -> DCT -> COCT -> CHCT
设备分配总结起来就是:设备分配过三关:设备可用、控制器可用和通道可用
3.2 设备分配的策略
设备分配方式有静态分配和动态分配两种。
-
静态分配:主要用于独占设备的分配,如打印机。由系统一次性分配该作业需要的全部设备、控制器等,一旦分配,将一直被该作业占用,直到作业完成。
-
动态分配:在进程执行过程中根据执行需要进行。
3.3 设备分配的安全性
设备分配的安全性指的是是否会发生死锁。
-
安全分配方式:当进程发出I/O请求后进入阻塞状态,直到完成才被唤醒。这种工作方式是CPU与I/O设备串行工作,预防了死锁的发生。
-
不安全分配方式:进程在执行过程中根据需求发出I/O请求。也意味着一个进程可以同时操作多个设备,提高工作效率,但容易造成死锁。
3.4 逻辑设备名到物理设备名的映射
用户使用设备时通过使用逻辑设备名来调用物理设备,因此建立一张表来查找从逻辑设备名到物理设备名的映射——逻辑设备表(LUT)。
image.png4. 虚拟设备技术
除了使用缓存区来解决CPU与I/O设备速度不匹配问题外,可以使用虚拟设备技术(SPOOLing),主要是利用外围控制机,将低速I/O设备上的数据传送到高速磁盘上。常用于共享打印机。
image.png