目录
由于I/O设备种类繁多,差异巨大,因此需要多种方法来进行设备控制。这些方法共同组成了操作系统内核的IO子系统(即上节中的软件层次结构中的三种软件程序),它将内核的其他方面从繁重的I/O设备管理中解放出来。I/O核心子系统提供的服务主要有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等。
1. I/O调度
概念:采用某种策略来确定一个比较好的I/O请求顺序,应用程序发布的系统调用不一定总是最佳顺序,所以需要I/O调度来改善系统整体性能,减少I/O完成所需要的平均等待时间
2. 缓冲区与高速缓存
(1)缓冲区Buffer
缓冲区是一个存储区域,可以利用内存作为缓冲区,也可以由专门的硬件寄存器组成
【注】:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
缓冲区的作用:
①缓和CPU与I/O设备之间速度不匹配的矛盾
②减少对CPU的中断频率,放宽对CPU中断相应时间的限制
③解决数据单元大小不匹配的问题
④提高CPU与I/O设备之间的并行性
缓冲技术:
1) 单缓冲
操作系统会在内存中设置一个缓冲区,设备和CPU交换数据时,先把被交换的数据写入缓冲区,然后需要数据的设备或CPU从缓冲区取走数据
由上图所示,计算每块数据处理的时间:
首先设置初始状态:工作区满,缓冲区空
当T>C时,处理一块数据的平均时间为M+T;
同理,当T<C时,处理一块数据的平均时间为C+M
所以采用单缓冲策略,处理一块数据平均耗时Max(C, T)+M
【注】:在研究各种缓冲技术的每块数据处理时间时,假设一种初始状态,计算下一次到该种状态的时间就是处理一块数据所需时间
2)双缓冲
为了加快输入输出速度,提高设备利用率,在单缓冲基础上增加一个缓冲区,设置双缓冲机制:
双缓冲机制的计算中,假设初始状态:工作区空,其中一个缓冲区满,另一个缓冲区空
当T>C+M时,处理一块数据的平均时间为T
当T<C+M时,处理一块数据的平均时间为M+C
所以采用双缓冲策略,处理一块数据平均耗时Max(M+C, T)
3)循环缓冲
将多个大小相等的缓冲区链接成一个循环队列,在输入输出时,需要in and out指针。In指针指向下一个可以输入数据的空缓冲区;out指针指向下一个可以取出数据的满缓冲区
4)缓冲池
缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。
同时又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin) 、用于提取输入数据的工作缓冲区(sin) 、用于收容输出数据的工作缓冲区(hout) 、用于提取输出数据的工作缓冲区(sout)
工作方式:
①输入进程请求输入数据。从空缓冲队列中取出一块作为收容输入数据的工作缓冲区(hin) 冲满数据后将缓冲区挂到输入队列队尾
②计算进程想要取得一块输入数据。从输入队列中取得一块冲满输入数据的缓冲区作为
“提取输入数据的工作缓冲区(sin) ”,缓冲区读空后挂到空缓冲区队列
③计算进程想要将准备好的数据冲入缓冲区。从空缓冲队列中取出一块作为“收容输出数据的工作缓冲区( hout)”数据冲满后将缓冲区挂到输出队列队尾
④输出进程请求输出数据。从输出队列中取得一块冲满输出数据的缓冲区作为“提取输出数据的工作缓冲区(sout)"缓冲区读空后挂到空缓冲区队列
(2)高速缓存Disk Cache
高速缓存是可以保护数据拷贝的高速存储器。为解决CPU与I/O速度不匹配的矛盾,OS中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。
磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
高速缓存在内存中分为两种形式: 一种是在内存中开辟一个单独的存储空间作为碰盘高速缓存,大小固定;另一种是把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘VO时共享。
3. 设备分配与回收
(1)设备分配时考虑的因素
设备的固有属性:
①独占设备:一个时段只能分配给一个进程(如打印机)
②共享设备:一可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备,而微观上交替使用。
③虚拟设备:采用SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用(如采用SPOOLing技术实现的共享打印机)
设备分配算法:常用的算法有先来先服务;优先级高者优先;短任务优先
设备分配安全性:
①安全分配:为进程分配一个设备后就将进程阻塞,本次I/0完成后才将进程唤醒。(eg: 考虑进程请求打印机打印输出)一个时段内每个进程只能使用个设备
优点:破坏了“请求和保持”条件,不会死锁
缺点:对于一个进程来说,CPU和/O设备只能串行工作
②不安全分配进程发出I/O请求后,系统为其分配I/0设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。一个进程可以同时使用多个设备
优点:进程的计算任务和I/O任务可以并行处理,使进程迅速推进
缺点:有可能发生死锁(需要死锁避免、死锁的检测和解除)
(2)设备分配方式
①静态分配:主要用于对独占设备的分配,进程运行前为其分配全部所需资源,运行结束后归还资源;这种方式破坏了请求和保持条件,所以不发生死锁,但是设备的使用效率低
②动态分配:进程运行过程中动态申请设备资源;有利于提高设备利用率,但可能发生死锁
(3) 设备分配的数据结构
设备分配依据的主要数据结构有设备控制表;控制器控制表;通道控制表和系统设备表
①设备控制表DCT:系统为每个设备配置一张DCT,表中的表项就是设备的各个属性
②控制器控制表COCT:每个设备控制器都会对应一张COCT,OS根据COCT的信息对控制器进行管理操作
③通道控制表CHCT:每个通道都会对应一张CHCT,OS根据CHCT的信息对通道进行操作管理
④系统设备表SDT:记录了系统中全部设备的情况,每个表目对应一个设备
(4) 设备分配的过程
①根据进程请求的物理设备名查找SDT
②根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
(5)设备分配过程的改进
上述设备分配过程中用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程;若换了一个物理设备,则程序无法运行;若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
改进:建立逻辑设备名与物理设备名的映射机制(逻辑设备表),用户编程时只需提供逻辑设备名。
整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统
每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统
4. 假脱机技术SPOOLing
为了缓和CPU的高速性和I/O设备的低速性的矛盾,批处理阶段映引入了脱机输入/输出技术(磁带完成),该技术利用专门的外围控制机将低速I/O设备上的数据传送到高速磁盘上。而SPOOLing技术是用软件的方式模拟脱机技术:
(1) 输入/输出井
在磁盘上开辟出两个存储区域—输入/输出井,输入井模拟脱机输入时的磁带,用于收容I/O设备输入的数据;输出井模拟脱机时的磁带,用于收容用户进程的输出数据
(2) 输入/输出缓冲区
输入缓冲区和输出缓冲区是在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
(3) 输入/输出进程
输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到
输入井。当CPU需要输入数据时,直接将数据从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备。
(4) 共享打印机原理
共享打印机是SPOOLing技术的实例,打印机由独占式设备转变为共享设备。
当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程为每个进程做两件事:
(1)在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中;
(2)为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的),再将该表挂到假脱机文件队列上。