516_假脱机技术
# 5.1_6_假脱机技术
各位同学大家好,在这个小节中我们会学习假脱机技术,又叫 SPOOLing 技术,我们首先会介绍一下什么是脱机技术,脱机技术可以解决什么问题。
假脱机技术其实是用软件的方式来实现了脱机技术,所以接下来我们会介绍假脱机技术的实现原理,介绍一些很重要的概念。最后我们会用共享打印机的案例,来分析一下假脱机技术的具体实现和应用。
# 什么是脱机技术
咱们在第一章操作系统的发展历程小节当中学过,在刚开始就是手工输入的没有操作系统的阶段,都是需要用这样的很慢速度的纸带机来把这些程序员的程序读入,然后 CPU 需要直接和纸带机交互,所以由于纸带机的速度特别慢,因此这个输入还有把结果输出的过程都会很慢,所以虽然 CPU 的处理速度很快,但是在数据输入和数据输出的时候,CPU 依然需要迁就纸带机的慢速的输入输出,所以在这个阶段就暴露出了很严重的这种速度矛盾,这对 CPU 这种昂贵的资源是一种极大的浪费
所以在之后的批处理阶段,人们引入了脱机技术,刚开始的脱机技术是用磁带来实现的,引入了脱机技术之后,程序员可以先用纸带机把自己的这些程序数据输入到磁带当中,而磁带的速度要比纸带机要快得很多,而这个输入的过程是由一台专门的外围控制机来实现的。由于这些程序的数据首先被输入到了更快速的磁带当中,而之后 CPU 可以直接从磁带中读取想要的这些输入数据,因此这就很大的缓解了这种速度的矛盾。也就是说引入了脱机输入技术之后,在数据输入的时候速度就快了很多,在输出的时候其实也一样,主机首先会把数据输出到一个很快速的磁带上,之后又会有一个外围控制机,控制着把这磁带当中的数据一依次的输出到这些慢速的磁带机上。同样的由于磁带的速度比纸代机的速度快很多,因此 CPU 在输出的时候就可以节省很多等待输出完成的时间了,这样的话就大的提升了 CPU 的利用率。
为什么这种技术叫做脱机技术?其实所谓脱机是指脱离主机的控制来进行输入和输出的操作,在刚才讲解中我们也已经明白了,其实这个输入和输出它是由一个外围控制机来实现的,显然输入和输出的过程其实并不需要主机或者说 CPU 的干预和控制,这样的话就可以让 CPU 有更多的时间去处理别的那些计算的任务了。
所以其实引入了脱机技术之后,除了缓解了 IO 设备,还要快速的 CPU 之间的速度矛盾之外,还有一个好处就是即使 CPU 正在忙碌,但是也可以在外围控制机的控制下,先把数据预先的把它输入到磁带当中,而在输出的时候,即使指代机现在正在忙碌,但是 CPU 也可以先把数据输出到磁带当中。
# 假脱机技术
基于脱机技术的思想,人们又发明了所谓的假脱机技术,又叫 SPOOLing 技术。假脱机技术当中的脱机其实是用软件的方式来模拟实现的。一个 SPOOLing 或者叫假脱机系统,一般来说有这样的一些部分组成,系统会在磁盘上开辟出两个存储区,一个是叫输入井,一个是叫输出井。输入井就是用于模拟脱机输入时候的磁带,用于收容从输入设备输入的这些 l 数据,而输出井是用来模拟脱机输出时候的磁带,用于收容用户进程输出的数据。
回到刚才的这个图的话,输入井其实就是用于模拟磁带的功能,而输出井就是用于模拟磁带的功能,这是输入井和输出井的一个作用。
除了这个磁带之外,外围控制机其实也是实现脱机技术当中一个很重要的部件,外围控制机就是由一个输入进程和一个输出进程来实现的,输入进程就是模拟脱机输入时的外围控制机,而输出进程是模拟输出时候的外围控制机
显然输入进程和输出进程肯定需要和用户进程并发的执行,才可以完成这种模拟脱机输入和模拟脱机输出的过程,因此 SPOOLing 技术肯定是需要有多道程序技术的支持的。
再回到这个图输入进程就是模拟外围控制机的功能,也就是说当有数据需要从设备输入到计算机的时候,输入进程其实是用软件的方式模拟外围控制机,输入进程会把这些要输入的数据放到磁盘的输入井当中,而输出进程在模拟脱机输出的时候原理也类似,无非就是从磁盘的输出井当中取出数据,然后输出到这个设备上。
这个地方大家还需要注意,在内存当中也会开辟这样的两个缓冲区,一个叫输入缓冲区,一个输出缓冲区,其实它们的作用就是模拟脱机输入,还要模拟脱机输出的时候,作为一个数据的中转站这样的角色。所以输入进程在实现模拟脱机输入的时候,其实是先接收了输入设备的数据,然后把这些数据先放到输入缓冲区里,之后再把输入缓冲区当中的数据放到磁盘的输入井当中
而数据输出的时候其实是由输出进程从输出井当中取出数据,然后放到内存的输出缓冲区当中,之后再由输出缓冲区往输出设备写出数据,这就是假投机技术的一个原理,大家再结合刚才的图再自己理解一下。
# 共享打印机的原理
接下来我们来看一个具体的假脱机技术的应用,共享打印机的实现。咱们在之前的课程当中提到过两个概念,一个叫独占式设备,一个叫共享设备,所谓独占式设备就是指那些只允许各个进程串行的使用的设备,也就是说在一段时间内这种请求只能为一个进程服务,当他为进程服务结束之后,才可以接着就是答应下一个进程的请求,而共享设备是一种允许多个进程同时使用的设备,而这个地方所谓的同时有可能是宏观上的同时,微观上可能是各个进程交替的来使用这个设备的,所以一个共享设备其实是可以同时满足多个进程的使用请求的。
而我们知道打印机它肯定是一种独占式的设备,因为打印机的速度很慢,这一点大家在生活当中也有所体会,所以打印机这种设备在一段时间内肯定是只能为一个用户一个进程服务的,如果打印机设备同时处理多个进程的请求的话,那么就有可能会导致各个进程的打印输出结果相互串行,就是混杂在一起的这种情况,这显然不是我们期待的。
所以对于独占式设备来说,如果一个进程正在使用这个打印机,另一个进程在请求使用打印机的时候,必然是需要阻塞等待的,只有第一个进程使用完了打印机,并且释放了资源之后,第二个进程才可以被激活,然后继续发出打印请求
既然打印机它是一种独占式的设备,为什么我们这还把它称作共享打印机?其实这所谓的共享就是用 SPOOLing 技术,也就是假脱机技术来实现的。
如果有多个用户提出要使用打印机的请求的话,那么系统首先会答应他们的请求,但是并不会直接把打印机分配给其中的某一个进程,而是由一个叫做假脱机管理进程的东西,为每个用户进程做这样的两件事。
第一件事是在磁盘的输出井当中为进程申请一个空闲的缓冲区,也就是说其实这个缓冲区是在磁盘里的缓冲区,而不是内存中的缓冲区。那之后假脱机管理进程会把用户进程想要打印输出的数据把它先放到给他申请的缓冲区当中,这是管理进程做的第一件事。
第二件事他还会为用户进程申请一张空白的打印请求表,并且把用户的打印请求各种参数填入表中,所以其实这个表就是用来说明用户的打印数据放在哪个缓冲区里,存放在什么地方,等等这一系列信息的,它的本质无非就是一个打印任务的说明书对吧。接下来这个打印任务的说明书会被挂到一个叫做脱机文件队列的队列上,这个文件队列其实就是一系列的打印任务的队列
所以之后输出进程会从这个任务队列当中取出某一个任务,然后根据打印请求表的说明来执行相应的那些打印任务。比如说刚才用户进程提出的打印任务,此时就是挂在队列的队头的,所以此时输出进程应该先满足的是队头的任务。因此根据打印任务表,他就可以知道此时要打印输出的这些数据是在这一块缓冲区当中的,所以它会从这块缓冲区当中读出这个数据,然后把这个数据首先读入到内存的输出缓冲区当中之后,再从输出缓冲区把数据输出到打印机上,让打印机执行具体的打印任务。
当打印任务完成了之后,这个打印文件表就可以从这个队列当中删除了,那之后只要打印机空闲,输出进程就可以从队列中再取出下一个任务,然后根据这个任务的指示来执行后续的那些打印任务。
所以在采用了 SPOOLing 技术之后,虽然系统当中只有一台打印机,但是每个进程在提出打印请求的时候,系统都会为进程在输出井当中,申请一个缓冲区,一个存储区,其实这就相当于为进程分配了一个逻辑上的设备,所以这样的话就可以让每个用户进程都感觉到似乎都是自己独占了一个打印机设备一样,这样的话就实现了对打印机的共享使用。所以 SPOOLing 技术可以把一台物理上的设备虚拟成若干个逻辑上的多台设备,可以把这种独占式的设备改造成共享设备,这就是 SPOOLing 技术的一个具体应用。
# 小结
那么这个小节的内容不多也不难,刚开始我们介绍什么是脱机技术,它产生的一个历史背景,它可以实现数据的预输入和缓输出,在现在的操作系统当中,一般来说使用软件的方式来模拟实现脱机技术,也就实现了所谓的假脱机技术,也叫 SPOOLing 技术。我们需要对假脱机技术当中的输入井,输出井,输入进程,输出进程等等这些概念和脱机技术当中的那些部件一一的对应起来来理解和记忆。最后我们就介绍了 SPOOLing 技术的一个具体应用,把独占式的打印机改造成一个共享打印机。