(6)虚拟设备和SPOOLing技术
1.虚拟设备
通过虚拟技术将一台独占设备虚拟成多台逻辑设备,供多个进程同时使用, 通常把这种经过虚拟的设备称为虚拟设备。
2.SPOOLing技术
(汤小丹P220)🔎:
如果说,通过多道程序技术可将一台物理CPU虚拟为多台逻辑CPU,从而允许多用户共享一台主机,那么,通过假脱机技术,则可将一台物理I/O设备虚拟为多台逻辑I/O设备,这样也就允许多个用户共享一台物理设备。
1)假脱机技术
当系统中引入了多道程序技术后,可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速I/0设备上:的数据传送到高速磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。
这样,便可在主机的直接控制下,实现脱机输入、输出功能。此时的外围操作与CPU对数据的处理同时进行,把这种在联机情况下实现的同时外围操作称为SPOOLing,或称为假脱机操作。
2)SPOOLing的组成
SPOOLing系统主要由一下四个部分构成:
a.输入井、输出井
这是在磁盘上开辟的两大存储空间。输入井是模拟脱机输入时的磁盘设备,用于暂存I/0设备输入的数据:输出井是模拟脱机输出时的磁盘设备,用于暂存用户程序的输出数据。
b.输入缓冲区、输出缓冲区
为缓和CPU与磁盘之间速度不匹配的矛盾,在内存中开辟输入缓冲区、输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井;输出缓冲区用于暂存由输出井送来的数据,以后再传送到输出设备。
c.输入进程、输出进程
两个进程用于模拟脱机I0时的外围控制机。输入进程用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备、通过输入缓冲区、再送到输入井,当CPU需要数据时,直接从输入井读入内存;输出进程用于模拟脱机输出时的外围控制机,将用户要求输出的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,通过输出缓冲区、送到输出设备。
3)🌟SPOOLing系统的特点
a.提高了I/O的速度。
b.将独占设备改造为共享设备。
c.实现了虚拟设备功能。
4)共享打印机
当用户进程请求打印输出时,SPOOLing 系统同意为它打印输出,但并不立即把打印机分配给该用户进程,只为它做两件事:
①由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中;
②输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将 该表挂到请求打印队列上。
如果还有进程请求打印,系统仍为之做.上述两件事情。
当打印机空闲时,输出进程从请求打印队列的队首,取出一张请求打印表,根据表中的要求,将要打印的数据,从输出井传送到内存缓冲区,进行打印;直到所有请求响应完成,输出进程阻塞;仅当再有打印请求时,才被唤醒。
(7)缓冲管理
1.缓冲的引入
🌟引入缓冲的原因:
1)缓和CPU与I/O设备间速度不匹配的矛盾。
2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
3)解决数据粒度不匹配的问题
4)提高CPU和I/O设备之间的并行性
2.单缓冲区和双缓冲区
1)单缓冲区(Single Buffer)
在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,OS将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据处理(计算)的时间为C。由于T和C是可以并行的(见图),当T>C时,系统对每一块数据的处理时间为M+T;反之则为M+C,故系统可把系统对每一块数据的处理时间表示为Max(C,T)+M。
图 单缓冲工作示意图
2)双缓冲区(Double Buffer)
在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时操作系统可以从第一缓冲区中移出数据,并送入用户进程(见图)。接着由CPU对数据进行计算。在双缓冲时,系统处理一块数据的时间可以粗略地认为时Max(C,T),如果C<T,可使块设备连续输入;如果C>T,则可使CPU不必等待设备输入。
图 双缓冲工作示意图
3.环形缓冲区
1)环形缓冲区的组成
a.多个缓冲区。环形缓冲中包含多个缓冲区,其每个缓冲区的大小相同。作为输入的多缓冲区可分为三个类型:用于装输入数据的空缓冲区R、已装满数据的缓冲区G以及计算进程正在工作的现行工作缓冲区C,如下图。
b.多个指针。作为缓冲区可设置三个指针:用于指示计算进程下一个可用缓冲区G的指针Nextg、指示输入进程下次可用的空缓冲区R的指针Nexti,以及用于计算进程正在使用的缓冲区C的指针Current。
图 环形缓冲区
2)环形缓冲区的使用
a.Getbuf过程。
b.Releasebuf过程。
3)进程之间的同步问题
a.Nexti指针追赶上Nextg指针。这意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。【这种情况被称为系统受计算限制】
b.Nextg指针追赶上Nexti指针。这意味着输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数据。【这种情况被称为系统受I/O限制】
4.缓冲池
1)缓冲池的组成
🔎:
一般将缓冲池中具有相同类型的缓冲区链接成一个队列,形成一下三个队列:
a.空白缓冲队列emq b.输入队列inq c.输出队列outq
除了上述三个队列外,还需具有四个工作缓冲区:
用于收容输入数据的工作缓冲区【hin】
用于提取输入数据的工作缓冲区【sin】
用于收容输出数据的工作缓冲区【hout】
用于提取输出数据的工作缓冲区【sout】
(8)设备处理与I/O软件
1.与设备无关的I/O软件
为了实现设备独立性,必须再在设备驱动程序之上设置一层软件,称为与设备无关的I/O软件,或设备独立性软件。(P213)🔎:
1)基本概念
a.以物理设备名使用设备
b.引入了逻辑设备名
c.逻辑设备名称到物理设备名的转换
2)与设备无关的软件
程序员写出的软件无需修改便能读出软盘、硬盘以及CD-ROM等不同设备上的文件
2.用户空间的I/O软件
1)I/O相关的库例程
2)假脱机系统(spooling)
创建一个特殊的daemon进程,解决多个进程使用打印机的资源管理问题
(9)设备分配
(汤小丹p215)🔎:
1.设备分配中的数据结构
1)设备控制表DCT
系统为每个设备设置一-张设备控制表,用于记录该设备的情况。
在设备控制表中,包含:
(1)设备类型
(2)设备标识符
(3)设备队列的队首指针(队列中存放请求设备未被满足的PCB)
(4)设备状态
(5)与设备相连的控制器表指针
(6)重复执行次数。系统规定在设备工作中发生错误时可重复执行次数。
2)控制器控制表、通道控制表和系统设备表
a.设备控制表(COCT)
b.通道控制表(CHCT)
c.系统设备表(SDT)
2.设备分配时应考虑的因素
1)设备固有属性
a.独占设备。采取独占的分配策略
b.共享设备。可以通过某种调度方式,分配给多个进程使用。
c.虚拟设备。通过采用虚拟技术,使一台物理设备可变成多台逻辑上的共享设备。可以分配给多个进程使用。
2)设备分配算法
a.先来先服务
当多个进程对同一设备提出I/0请求时,该算法根据进程提出请求的先后次序,排成一个设备请求队列,总是将设备分配给队首进程。
b.优先级高者优先
在这种算法中,总是优先权高的进程优先获得资源。对于优先权相同的进程,按照先来先服务的原则排队。
3)设备分配中的安全性
a.安全分配方法
当进程请求资源时,便进入阻塞状态,直到I/0操作完成才被唤醒。但进程的并发度低,资源的利用率低。
b.不安全分配方法
当进程请求资源时,仍继续运行,需要时又发出第2个I/0请求,第3个I/0请求等,按照安全性算法进行计算,仅当状态安全时,才分配。这种方式稍复杂,但进程的并发度高。
3.独占设备的分配程序
1)基本的设备分配程序
当进程提出I/0请求后,按下列3个步骤进行分配。
a.分配设备。首先,根据I/0请求中的物理设备名,查找SDT, 找出该设备的设备控制表DCT,根据DCT中的设备状态字段,可知设备是否正忙。若忙,将该进程的PCB挂在设备的等待队列中;若不忙,按照一定的算法计算设备分配的安全性,来分配设备。
b.分配控制器。在系统将设备分配给请求进程后,从DCT中找到与该设备相连控制器的COCT,根据COCT中的状态字段,可知该设备控制器是否忙。若忙,将该进程的PCB挂在设备控制器的等待队列中;若不忙,将设备控制器分配给进程。
c.分配通道。在系统将设备控制器分配给请求进程后,从控制器控制表COCT中找到与该控制器相连的通道的通道控制表CHCT,根据CHCT中的状态字段,可知该通道是否正忙。若忙,将该进程的PCB挂在通道的等待队列中;若不忙,将通道分配给进程。
2)设备分配程序的改进
a.增加设备的独立性
进程利用逻辑设备名请求I/0。系统首先从系统设备表SDT中找出第一个该类设备的设备控制表DCT,若设备忙,再查找第2个该类设备的DCT;仅当所有该类设备都忙时,才将该进程的PCB挂在该类设备的等待队列中。
b.考虑多通路情况
可以按照多通路情况进行改进。例如,若设备连接的第一个控制器忙碌时,应查看第2个控制器,仅当所有该类设备控制器都忙时,才将该进程的PCB挂在该类设备控制器的等待队列中。同理,通道分配也是一样的。