操作系统 | 学习笔记 | | 王道 | 5.2 设备独立软件
5.2 设备独立性软件
IO核心子系统
磁盘IO也属于IO调度问题
5.2.1 与设备无关的软件
与设备无关的软件是I/O系统的最高层软件,它的下层是设备驱动程序。
- 设备保护:
- 操作系统需要实现文件保护功能,不同的用户对各个文件有不同的访问权限(如:只读、读和写等)
- 在UNIX系统中,设备被看做是一种特殊的文件,每个设备也会有对应的FCB。当用户请求访问某个设备时,系统根据FCB中记录的信息来判断该用户是否有相应的访问权限,以此实现“设备保护”的功能。
5.2.2 高速缓存与缓冲区
-
磁盘高速缓存(Disk Cache)
操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对访问高速缓存要比访问原始磁盘数据更为高效。
磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
- 高速缓存在内存中分为两种形式:
- 一种是在内存中开辟一个单独的空间作为磁盘高速缓存,大小固定
- 另一种是把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O时共享。
- 高速缓存在内存中分为两种形式:
-
缓冲区(Buffer)
-
概念:缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
- 硬件做缓冲区:使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
- 内存做缓冲区:一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区
-
作用
- 缓和CPU与I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
-
单缓冲
若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
这句话的意思应该是读缓冲区和写缓冲区都是加了PV的,是互斥的,写要一口气写满,读要一口气读完
设块设备输入缓冲区时间为T,缓冲区传送至工作区时间为M,CPU处理工作区时间为C:
- 若T>C,从初始状态到下一个开始状态,整个过程用时为M+T
- 若T<C,从初始状态到下一个开始状态,整个过程用时为M+C
结论:故单缓冲区处理每块数据的用时为 m a x ( C , T ) + M max(C,T)+M max(C,T)+M。
若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。
-
双缓冲
若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区。
双缓冲题目中,假设初始状态为;工作区空,其中一个缓冲区满,另一个缓冲区空
- 若T>C+M,则处理一块数据的平均用时为T
- 若T<C+M,意味着输入数据块速度要比处理机处理数据块速度更快,处理一个数据块的平均耗时为C+M
结论:采用双缓冲策略,处理一个数据块的平均耗时为 M a x ( T , C + M ) Max(T,C+M) Max(T,C+M)
使用单双缓冲区在通信时的区别
若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。
若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输。
-
循环缓冲
将多个大小相等的缓冲区链接成一个循环队列。
注:上图中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区。
-
缓冲池(这个还是看看视频的动画吧,不然太难记了)
缓冲池由系统中共用的缓冲区组成。
这些缓冲区按使用状况可以分为:
- 空缓冲队列
- 装满输入数据的缓冲队列(输入队列)
- 装满输出数据的缓冲队列(输出队列)
根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:
- 用于收容输入数据的工作缓冲区(hin)
- 用于提取输入数据的工作缓冲区(sin)
- 用于收容输出教据的工作绥冲区(hout)
- 用于提取输出数据的工作缓冲区(sout)
工作过程:
-
① 输入进程请求输入数据
从空缓冲队列中取出一块作为收容输入数据的工作缓冲区(hin)。冲满数据后将缓冲区挂到输入队列队尾
-
② 计算进程想要取得一块输入数据
从输入队列中取得一块冲满输入数据的缓冲区作为“提取输入数据的工作缓冲区(sin)”。缓冲区读空后挂到空缓冲区队列
-
③ 计算进程想要将准备好的数据冲入缓冲区
从空缓冲队列中取出一块作为“收容输出数据的工作缓冲区(hout)”,数据冲满后将缓冲区挂到输出队列队尾
-
④ 输出进程请求输出数据
从输出队列中取得一块冲满输出数据的缓冲区作为“提取输出数据的工作缓冲区(sout)”。缓冲区读空后挂到空缓冲区队列
-
书上有关于高速缓存和缓冲池的对比,可以看看
5.2.3 设备的分配与回收
设备分配时应考虑的因素
设备分配常用的算法:1、先来先服务算法 2、最高优先级算法
-
设备分配概述
设备分配是指根据用户的I/O请求分配所需的设备。分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。
从设备特性来看,分为以下三种设备:
- 独占式使用设备。进程分配到独占设备后,便由其独占,直至该进程释放该设备。
- 分时式共享使用设备。对于共享设备,可同时分配给多个进程,通过分时共享使用。
- 以SPOOLing方式使用外部设备。SPOOLing技术实现了虚拟设备功能,可以将设备同时分配给多个进程。这种技术实质上就是实现了对设备的I/O操作的批处理。
-
设备分配的数据结构
设备分配依据的主要数据结构有设备控制表(DCT)、控制器控制表(COCT)、通道控制表 (CHCT)和系统设备表(SDT),各数据结构功能如下。
-
设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备情况
系统会根据阻塞原因的不同,将进程PCB挂到不同的阻塞队列中
-
控制器控制表(COCT):每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行操作和管理。
-
通道控制表(CHCT):每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理。
-
系统设备表(SDT):记录了系统中全部设备的情况,每个设备对应一个表目。
设备、控制器、通道之间的关系
-
-
设备分配的策略
-
设备分配原则。设备分配应根据设备特性、用户要求和系统配置情况。既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开。
-
设备分配方式。设备分配方式有静态分配和动态分配两种。
-
①静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源。主要用于对独占设备的分配,它在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器。
静态分配方式不会出现死锁,但设备的使用效率低。
-
②动态分配:进程运行过程中动态申请设备资源。在进程执行过程中根据执行需要进行。
这种方式有利于提高设备利用率,但若分配算法使用不当,则有可能造成进程死锁。
-
-
设备分配算法。常用的动态设备分配算法有先请求先分配、优先级高者优先等。
-
-
设备分配的安全性
设备分配的安全性是指设备分配中应防止发生进程死锁。
-
安全分配方式。
- 为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。一个时段内每个进程只能使用一个设备。
- 优点:破坏了“请求和保持”条件,不会死锁
- 缺点:对于一个进程来说,CPU和I/O设备只能串行工作
-
不安全分配方式。
进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。一个进程可以同时使用多个设备。
- 优点:进程的计算任务和I/O任务可以并行处理,使进程迅速推进
- 缺点:有可能发生死锁(死锁避免、死锁的检测和解除)
-
-
设备分配的步骤
-
步骤
- ① 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数),用设备标识符(物理设备名)和进程提供的物理设备名进行比较
- ② 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程,查看状态是否空闲。
- ③ 根据DCT里面存的指针找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- ④ 根据COCT里面存的指针找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
注:只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备进行数据传送
-
缺点
- ①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
- ②若换了一个物理设备,则程序无法运行
- ③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
-
-
设备分配步骤的改进
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名。
这是为了实现
设备的独立性
:用户在编程时使用的设备与实际设备无关。-
逻辑设备表(LUT)
逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。
某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。
如果之后用户进程再次通过相同的逻辑设备名请求使用设备,则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
- 整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统
- 每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统
-
步骤
- ① 根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
- ② 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
- ③ 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- ④ 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
-
5.2.4 SPOOLing技术(假脱机技术)
-
概念
-
脱机技术:脱离主机的控制进行的输入/输出操作。
批处理阶段引入了脱机输入/输出技术(用磁带完成),在外围控制机的控制下,慢速输入设备的数据先被输入到更快速的磁带上。之后主机可以从快速的磁带上读入数据,从而缓解了速度矛盾。
-
SPOOLing技术:“假脱机技术”,又称“SPOOLing技术”,用软件的方式模拟脱机技术。
要实现SPOOLing技术,必须要有多道程序技术的支持。系统会建立“输入进程”和“输出进程”
-
-
原理
- 输入井和输出井
- 在磁盘上开辟出两个存储区域一一“输入井”和“输出井”
- ”输入井”模拟脱机输入时的磁带,用于收容I/O设备输入的数据
- “输出井”模拟脱机输出时的磁带,用于收容用户进程输出的数据
- 输入进程和输出进程
- “输入进程”模拟脱机输入时的外围控制机
- “输出进程”模拟脱机输出时的外围控制机
- 输入缓冲区和输出缓冲区
- 在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中
- 在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上
- 注意,输入缓冲区和输出缓冲区是在内存中的缓冲区
- 输入井和输出井
-
预读和滞后写
-
预读(提前读):
如果采用的顺序访问方式对文件进行访问,便可预知下一次要读的盘块。此时可采用预读策略,即在读当前块的同时,也将下一个盘块提前读入内存缓冲区,这样在访问下一个盘块时就不需要再启动磁盘,从而提升磁盘I/O速度。
-
滞后写(延迟写)
滞后写是指缓冲区A中的数据本应立即写回磁盘,但考虑到其中的数据在不久之后有可能再次被访问,因此并不会立即把A中的数据写回磁盘,而是将缓冲区A挂到空闲缓冲区队列。如果有别的进程申请使用该缓冲区时,才把A中的数据写回磁盘。这样做的好处是,只要缓冲区A仍在队列中,任何访问该数据的进程,都可以直接读出其中的数据而不必访问磁盘。因而这种方式也可以减少磁盘I/O次数,改善性能。
-
-
共享打印机的原理分析
SPOOLing技术可以把一台物理设备虚拟成逻辑上的多台设备,可将独占式设备改造成共享设备。
- 当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程为每个进程做两件事:
- 1)在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中
- 2)为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的),再将该表挂到假脱机文件队列上。
当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务。
虽然系统中只有一个台打印机,但每个进程提出打印请求时,系统都会为在输出井中为其分配一个存储区(相当于分配了一个逻辑设备),使每个用户进程都觉得自己在独占一台打印机,从而实现对打印机的共享。
- 当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程为每个进程做两件事:
5.2.5 设备驱动程序接口
要求每个设备驱动程序与操作系统之间都有着相同或相近的接口。这样会使得添加一个新设备驱动程序变得很容易,同时也便于开发人员编制设备驱动程序。
对于每种设备类型,例如磁盘,操作系统都要定义一组驱动程序必须支持的函数。
与设备无关的软件还要负责将符号化的设备名映射到适当的驱动程序上。
在UNIX和Windows中,设备是作为命名对象出现在文件系统中的,因此针对文件的常规保护规则也适用于I/O设备。系统管理员可以为每个设备设置适当的访问权限。
5.2.6 本节小结
1)当处理机和外部设备的速度差距较大时,有什么办法可以解决问题?
可采用缓冲技术来缓解CPU与外设速度上的矛盾,即在某个地方(一般为主存)设立一片缓冲区,外设与CPU的输入/输出都经过缓冲区,这样外设和CPU就都不用互相等待。
2)什么是设备的独立性?引入设备的独立性有什么好处?
设备独立性是指用户在编程序时使用的设备与实际设备无关。一个程序应独立于分配给它的某类设备的具体设备,即在用户程序中只指明IO使用的设备类型即可。
设备独立性有以下优点:①方便用户编程。②使程序运行不受具体机器环境的限制。③便于程序移植。
错题总结或需要多加注意的点
1.因为CPU速度比IO设备高很多,缓冲技术的缓冲区缓冲池通常在主存中建立
2.单双缓冲通信时都可以实现数据的双向传输,只是单不能在同一时刻而双可以
3.如果IO比CPU快很多,那么缓冲区就没必要设置
4.缓冲区管理者着重需要考虑的问题是实现进程访问缓冲区的同步,因为缓冲区是一种临界资源,要互斥的进行访问
5.设备分配程序为进程分配设备的过程是:先分配设备,再分配设备控制器,最后分配通道
6.单机中最重要的是CPU资源,要提高单机资源利用率优先提高CPU资源利用率。
7.SPOOLing技术主要目的是提高独占设备的利用率
8.SPOOLing技术需要内存空间和磁盘空间,不需要外围计算机支持
9.SPOOLing包含的三部分:
1.输入井输出井,由预输入程序管理
2.输入和输出缓冲区,由井管理程序管理
3.输入进程和输出进程,由缓输出程序管理
10.独享设备采用静态分配,共享设备采用动态分配
11.向设备寄存器写命令是设备驱动程序完成的
12.驱动程序仅有一部分是汇编语言编写,剩下的都是高级语言
13.对IO设备传回的数据的分析或缓冲是由操作系统或者进程完成的不是设备驱动程序
14.设备驱动程序的处理过程:
1.将抽象要求转化为具体要求
2.对服务请求进行校验
3.检查设备的状态
4.传送必要的参数
5.启动IO设备
15.SPOOLing技术是以多道程序设计技术的支持
16.更换物理设备后不用必须修改访问该设备的应用程序,而是只需要修改驱动程序即可
17.初始化设备是由驱动程序控制完成的
18.设备分配需要考虑:
1.设备的类型
2.设备的访问权限
3.设备的占用状态
4.逻辑设备与物理设备的映射关系