对设备进行控制的方法组成了操作系统内核的I/O子系统,提供的服务有I/O调度,缓冲与高速缓存,设备分配与回收,假脱机,设备保护,差错处理。
- I/O调度
确定一个好的顺序来执行这些I/O请求,来改善系统整体性能,进程之间公平的共享设备访问,减少I/O完成所需要的平均时间。
为每个设备维护一个请求队列来实现调度,当一个应用程序执行阻塞I/O系统调用时候,请求加到相应设备的队列上。I/O调度会重新安排队列顺序以改善系统总体效率和应用程序的平均响应时间。
磁盘调度算法其实就是I/O调度的一种。 - 高速缓存和缓冲区
- 磁盘高速缓存
使用磁盘高速缓存技术来提高磁盘的I/O速度,正在运行的进程的指令既存储在磁盘上,也存储在物理内存中,也被复制到CPU的二级和一级高速缓存中。
磁盘高速缓存技术是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。磁盘高速缓存在逻辑上属于磁盘,物理上是驻留在内存中的盘块。
高速缓存分为两种形式,一是内存中开辟单独的存储空间作为磁盘高速缓存, 大小固定。另一种是未利用的内存空间作为缓冲池,供请求分页系统和磁盘I/O时共享。 - 缓冲区
CPU和I/O设备间速度不匹配的矛盾
减少对CPU的中断频率
解决基本数据单元大小不匹配的问题
提高CPU和I/O设备之间的并行性
缓冲区,内存区域,当缓冲区数据非空的时候,不能往缓冲区冲入数据,只能从缓冲区把数据传出。缓冲区为空的时候,可以往缓冲区冲入数据,但是必须把缓冲区充满后,才能从缓冲区把数据传出。- 单缓冲
设备和处理机之间设置一个缓冲区,设备和处理机交换数据的时候,先把交换数据写入缓冲区,然后需要数据的设备或者处理机从缓冲区拿走数据。
数据冲入缓冲区的时间为T,操作系统将缓冲区数据传入用户区时间为M,CPU处理时间为C。
每块数据块的处理时间为max(C,T)+M,根据图来进行回忆分析。 - 双缓冲
CPU在M时间是空闲的,所以在缓冲区1充满后,开始冲缓冲区2,同时CPU将缓冲区1的数据取出到用户进程处理,然后缓冲区1数据处理完后,缓冲区2如果满的话,继续处理,然后填缓冲区1。如果没满,一直到装满再让处理机从缓冲区2取数据。
处理一块数据的用时,分为T>C+M或者T<C+M的情况,然后根据图形和原理进行分析,Max(C+M,T)
T>C+M使块设备连续输入,T<C+M使CPU不必等待设备输入,CPU一直工作。
对于字符设备,行输入方式,双缓冲可以在输入第一行之后,CPU执行命令的时候继续输入下一行的数据。
两台机器之间通信如果只配置了单缓冲,那么同时只能实现单方向的数据传输,实现双向数据传输,则在两台机器上都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区。 - 循环缓冲区
包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指向第一个缓冲区,多个缓冲区构成一个环形。
in指针指向可以输入数据的第一个空缓冲区,out指针指向可以提取数据的第一个满缓冲区。 - 缓冲池
由多个系统公用的缓冲区组成,缓冲区形成三个队列:空缓冲队列,装满输入数据的缓冲队列,装满输出数据的缓冲队列。还有四种缓冲区,用于收容输入数据的工作缓冲区,用于提取输入数据的工作缓冲区,用于收容输出数据的工作缓冲区,用于提取输出数据的工作缓冲区。
工作过程:当输入进程需要输入数据的时候,从空缓冲队列的队首摘下一个空缓冲区,作为收容输入工作缓冲区,把输入数据输入其中,装满后把它挂到输入队列队尾,计算进程需要输入数据的时候,从输入队列取得一个缓冲区作为提取输入工作缓冲区,数据用完之后将它挂到空缓冲队列尾。
- 单缓冲
- 高速缓存和缓冲区
高速缓存是可以保存数据拷贝的高速存储器,访问高速缓存比访问原始数据更加有效,速度更快。而缓冲区是高速设备和低速设备的通信都需要缓冲区,高速设备不会直接访问低速设备。
- 设备分配与回收
- 设备
- 独占式设备
- 分时式共享使用设备,比如对磁盘设备的I/O操作。
- 以SPOOLing方式使用外部设备,对I/O操作进行批处理,空间换时间的技术,虚拟设备。
- 设备分配的数据结构
设备控制表DCT,控制器控制表COCT,通道控制表CHCT,系统设备表SDT。
设备控制表表征一个设备,控制表表项就是各个设备的各个属性。
每个DCT都需要一个表项来表示控制器,需要一个指向控制器控制表的指针,所以DCT和COCT有一一对应的关系。
现代操作系统的I/O控制采用的都是通道控制,设备控制器控制设备与内存交换数据,设备控制器又要请求通道为它服务,每个COCT必定有一个表项存放指向相应的通道控制表的指针,而一个通道可以为多个设备控制器服务,因此通道控制表有一个指针,指向一个表,这个表表达的是CHCT提供服务的那几个设备控制器。
系统设备表SDT,记录已经链接到系统中所有物理设备的情况,每个物理设备占一个表目。
合理的分配原则需要考虑,I/O设备的固有属性,I/O设备的分配算法,I/O设备分配的安全性,以及I/O设备的独立性。
- 设备分配的策略
分配的总原则,避免造成进程死锁,将用户程序和具体设备隔离开
分配的方式,静态分配,动态分配。
- 静态分配
主要用于对独占设备的分配,一次性分配作业要求的所有设备,控制器。静态分配不会出现死锁,但是设备的使用效率低。 - 动态分配
进程执行过程中根据执行需要进行,进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备,I/O控制器,用完之后立即释放,有可能造成进程死锁。 - 设备分配算法
有先请求先分配,优先级高者优先。
共享设备可以被多个进程所共享,一般采用动态分配方式,但是每个I/O传输的单位时间内只被一个进程所占有。
- 设备分配的安全性
指设备分配中应该防止发生进程死锁
- 安全分配方式
进程发出I/O请求后便进入阻塞状态,直到I/O操作完成时才被唤醒,进程获得某种设备后便阻塞,不能再请求任何资源,在阻塞时也不保持任何资源,缺点是CPU和I/O设备时串行工作的。 - 不安全分配方式
进程在I/O请求后继续运行,需要时候发出第二个,第三个请求,当进程所请求设备被其他进程占用时候,才进入阻塞状态,优点是一个进程操作多个设备,进程推进迅速,缺点是可能死锁。
- 逻辑设备名到物理设备名的映射
设备独立性是指应用程序独立于具体使用的物理设备
逻辑设备表,用于将逻辑设备名映射为物理设备名,LUT表项包括逻辑设备名,物理设备名和设备驱动程序入口地址。系统通过查找LUT来寻找相应的物理设备和驱动程序。
- 整个系统设置一张LUT,不允许有相同的逻辑设备名,适用于单用户系统中
- 每个用户设置一张LUT,用户登陆的时候,系统为用户建立一个进程,同时建立一张LUT,将该表放入进程的PCB中。
- SPOOLing技术,假脱机技术
脱机输入/输出技术,利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘中,或者相反,SPOOLing是外部设备同时联机操作,假脱机输入/输出操作,系统中采用的一项将独占设备改造成共享设备的技术。
- 输入井和输出井
输入井模拟脱机输入时的磁盘,收容I/O设备输入的数据,输出井模拟输出时的磁盘,用于收容用户程序的输出数据。 - 输入缓冲区和输出缓冲区
内存中,输入缓冲区用于暂存由输入设备送来的数据,以后再传入输入井,输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备。 - 输入进程和输出进程
输入的时候,将用户要求的数据从输入机通过输入缓冲区再送到输入井,CPU需要输入数据时候,直接将数据从输入井读入内存。输出进程把用户要求的输出数据从内存送到输出井,待输出设备空闲时候,再将输出井的数据经过输出缓冲区送到输出设备。
SPOOLing系统,提高了I/O速度,将独占设备改造成共享设备,实现了虚拟设备功能。
在SPOOLing技术下,CPU要打印机打印的数据可以先输出到磁盘的输出井里,然后再做其他事情。将打印请求挂到等待队列中,打印机有空的时候再把数据打印出来。
Tips:
- 磁盘时共享设备,一个时间间隔内可以被多个进程同时访问。
- 缓冲池时系统公用资源,可以供多个进程共享。
- 缓冲区是一种临界资源,使用缓冲区时都有申请和释放(互斥)的问题来考虑。
- 如果有高优先级的操作,记录鼠标活动情况,必须使用缓冲技术。
- 虚拟设备是靠将独占设备改造成共享设备,提高系统资源/独占设备利用率的SPOOLing技术实现的。
- SPOOLing系统由预输入程序,井管理程序,缓输出程序组成。