操作系统(15)-----I/O设备管理(万字总结~)(2):https://developer.aliyun.com/article/1511387
2.设备驱动程序接口
设备独立软件需要根据设备不同,调用不同的设备驱动程序接口,这对于设备独立软件而言很麻烦,若各公司开发的设备驱动程序接口不统一,则操作系统很难调用设备驱动程序。
所以系统可以统一设备驱动程序接口,设备厂商在制作驱动程序时, 按照规定的驱动程序接口开发驱动程序。
所以,不同的操作系统,对设备驱动程序接口的标准各不相同。设备厂商必须根据操作系统的接口要求,开发相应的设备驱动程序,设备才能被使用。
七.I/O核心层系统实现的功能
I/O核心层系统实现的功能主要有假脱机技术,I/O调度,设备保护,设备分配与回收以及缓冲区管理(即缓冲与告诉缓存),这些技术都与硬件无关,与硬件有关的技术在设备驱动程序与中断处理程序中实现,假脱机技术(SPOOLing技术)由用户层软件实现,其他则在设备独立性软件实现。
1.设备独立性软件
(1)I/O调度
用某种算法确定一个好的顺序来处理各个I/O请求。
如:磁盘调度(先来先服务算法、最短寻道优先算法、SCAN算法、C-SCAN算法、LOOK算法、C-LOOK算法)。当多个磁盘I/O请求到来时,用某种调度算法确定满足I/O请求的顺序。
同理,打印机等设备也可以用先来先服务算法、优先级算法、短作业优先等算法来确定I/0调度顺序。
(2)设备保护
上面讲设备独立性软件时提到过,设备会被看作一个特殊的文件,操作系统需要实现文件保护功能,不同的用户对各个文件有不同的访问权限(如:只读、读和写等)
在UNIX系统中,设备被看做是一种特殊的文件,每个设备也会有对应的FCB。当用户请求访问某个设备时,系统根据FCB中记录的信息来判断该用户是否有相应的访问权限,以此实现“设备保护”的功能。
(3)设备分配与回收
设备分配时应该考虑以下三个因素1.设备固有属性 2.设备分配算法 3.设备分配中的安全性
1.设备的固有属性可分为三种:独占设备、共享设备、虚拟设备
独占设备---一个时段只能分配给一个进程(如打印机)
共享设备---可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备而微观上交替使用。
虚拟设备---采用 SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用(如采用 SPOOLing 技术实现的共享打印机)
2.设备分配算法:先来先服务,优先级高者优先,短任务优先等
3.从进程运行的安全性上考虑,设备分配有两种方式:
安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。
使用这一分配方式,一个时段内每个进程只能使用一个设备
优点:破坏了“请求和保持”条件,不会死锁
缺点:对于一个进程来说,CPU和I/O设备只能串行工作
不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。
如果采用这种方式,一个进程可以同时使用多个设备
优点:进程的计算任务和I/O任务可以并行处理,使进程迅速推进
缺点:有可能发生死锁(死锁避免、死锁的检测和解除)
•静态分配与动态分配
静态分配:
进程运行前为其分配全部所需资源,运行结束后归还资源,破坏了“请求和保持”条件,不会发生死锁。
动态分配:
进程运行过程中动态申请设备资源。
•设备分配管理中的数据结构
之前学过“设备、控制器与通道”的关系,操作系统中有多个通道,一个通道管理多个控制器,一个控制器又管理多个设备,如下图,树形结构图所示:
1.设备控制表(DCT)
系统会为每个设备配一张DCT表(设备控制表),用于记录设备情况:
“进程管理”中曾经提到过“系统会根据阻塞原因不同,将进程PCB挂到不同的阻塞队列中”
若进程在等待某一个I/O设备,但是I/O设备暂时无法分配给该进程,那么该进程就会被挂在I/O设备的设备控制表的等待队列的队尾。
2.控制器控制表(COCT)
每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行操作和管理。
3.通道控制表(CHCT)
每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理。
4.系统设备表(SDT)
记录了系统中全部设备的情况,每个设备对应一个表目。
设备分配的步骤:
① 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)
操作系统查系统设备表时,就会将表目中的系统标识符与用户提供的物理设备名参数进行对比,找到匹配的表项,进而找到相应的设备控制表(DCT)
② 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
除了分配设备外,还需要把设备对应的控制器分配给进程,所以系统会根据“指向控制器表的指针”字段,找到COCT(控制器控制表)。
③ 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
分配控制器后,还需要给进程分配相应的通道,所以通过“指向通道表的指针”这一字段,找到CHCT(通道控制表)
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
可以观察到,从下到上,依次为进程分配空闲设备,控制器,通道,只有设备进行数据传送控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备
采用这种分配方式有以下几个缺点:
① 用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
②若换了一个物理设备,则程序无法运行
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
改进方法:
建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名(逻辑设备名可以是打印机等设备):
① 操作系统根据进程请求的逻辑设备名査找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
② 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。LUT表用于记录逻辑设备名道物理设备名的映射关系。
③找到指定,空闲的设备后,根据DCT(设备控制表)找到COCT(控制器控制表),若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT(通道控制表),若通道忙碌,则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。
某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。
如果之后用户进程再次通过相同的逻辑设备名请求使用设备则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
逻辑设备表的设置问题:
整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统
每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统
(4)缓冲区管理
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)。
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区,这里的缓冲区管理主要是围绕"内存作为缓冲区"的管理缓冲区的作用:
1.缓和CPU与I/O设备之间速度不匹配的矛盾
在CPU输出数据时,CPU可以把要输出的数据快速地放入缓冲区,直到缓冲区满后,就可以做别的事,再由慢速的I/O设备从缓冲区取走设备即可,数据输入时与此过程相反.
2.减少对CPU的中断频率,放宽对CPU中断响应时间的限制
若没有缓冲区,如果是字符型设备则每输出完一个字符就要向CPU发送一次中断信号
而处理中断信号是需要时间开销的,所以会降低系统的效能.
若存在缓冲区,只有在缓冲区满或缓冲区数据全部被取走,CPU才需要介入处理中断,这样就能减少CPU的中断频率.
3.解决数据粒度不匹配的问题
如,输出进程每次可以生成一块数据,但I/O设备每次只能输出一个字符.
若没有采用缓冲区,输出进程只能一个字符一个字符给I/O设备传送数据,若采用缓冲区,输出进程可以将一整块数据放到缓冲区中,由I/O设备一个字符一个字符向缓冲区读数据,输入进程类似
4.提高CPU与I/O设备之间的并行性
缓冲区管理的策略:
单缓冲:
假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
对一个数据块的处理需要经过哪些步骤:
①系统的主存会为进程分配一块大小的缓冲区 ,块设备会产生一块大小的数据,输入到缓冲区中.
② 这块数据需要被传到用户进程的工作区中才能被使用,用户进程的内存空间中,会分出一片工作区来接受输入/输出数据(一般也默认工作区大小与缓冲区相同)
③ 接下来用户进程就可以对这块数据进行处理了,处理完后,这一进程的工作区就能被腾空了
那么每处理一块数据平均需要多长时间?
技巧:假定一个初始状态,分析下次到达相同状态需要多少时间,这就是处理一块数据平均所需时间。
在“单缓冲”题型中,可以假设初始状态为工作区满,缓冲区空。
初始状态:工作区满,缓冲区空,假设T>C
由于T>C,因此CPU处理完数据后暂时不能将下一块数据传送到工作区,必须等待缓冲区中冲满
数据.
等到缓冲区满后,缓冲区又可以向用户进程的工作区传送数据
最后回到假设的初始状态,处理一块数据的平均用时= T+M
初始状态:工作区满,缓冲区空,假设T
T
当CPU处理结束,缓冲区的数据可以传送到工作区中
最后回到假设的初始状态,处理一块数据的平均用时= C+M
操作系统(15)-----I/O设备管理(万字总结~)(4):https://developer.aliyun.com/article/1511398