操作系统(15)-----I/O设备管理(万字总结~)(3):https://developer.aliyun.com/article/1511394
总结:采用单缓冲策略,处理一块数据平均耗时 Max(C, T)+M
双缓冲:
假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)
双缓冲题目中,假设初始状态为:工作区空,其中一个缓冲区满,另一个缓冲区空
① 假设T>C+M
在0时刻,可以将缓冲区的数据传送到工作区中,接下来CPU就可以处理工作区中的数据
与此同时块设备可以向缓冲区2中输入数据,由于T>C+M,系统不能把缓冲区2的数据传送到工作区
中,只有等T时间点过后,缓冲区2才能被冲满
经过T时间后,起始就回到了假设的初始状态,所以处理一块数据的平均用时=T
② 假设T
起始时,缓冲区2为空,设备可以向缓冲区2冲入数据,同时缓冲区1是冲满数据的,所以可以将缓冲区1的数据输入到工作区中,工作区满后,CPU就可以处理数据了
CPU处理完数据后,缓冲区2其实已经冲满了数据,接下来可以紧接着把缓冲区2的数据也传送到工作区中,接着CPU继续处理工作区中的数据
注:M(1)表示“将缓冲区1中的数据传送到工作区”;M(2)表示“将缓冲区2中的数据传送到工作区
在缓冲区2中的数据传送到工作区的同时,设备可以将数据传送到缓冲区1中
假设2T<2M+C,则I/O设备将缓冲区1冲满时,缓冲区2的数据尚未取空,因此I/O设备暂时不能冲入数据,只有缓冲区2被取空,设备才能往缓冲区2写入数据
所以可以观察到,若采用双缓冲区,并且T
但是我们可以发现,处理完一块数据都要耗时C+M,每处理一个数据块平均耗时C+M
总之,T
总结:采用双缓冲策略,处理一个数据块的平均耗时为 Max(T,C+M),若TC+M,那么平均耗时T
使用单/双缓冲在通信时的区别:
两台机器之间通信时,可以配置缓冲区用于数据的发送和接受。
如图所示,两台设备配置单缓冲区,A机要发送的数据要先放入A机缓冲区中,等缓冲区满时将数据发出
B机的缓冲区用于接受数据,B机的将缓冲区中的数据全部取走后,才能向A机发送数据
所以,若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。
为了实现双向传输,可以给两台机器配置双缓冲区:
一个缓冲区用来暂存即将发送的数据,一个缓冲区用来暂存接收的数据
所以,若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输。
循环缓冲:
将多个大小相等的缓冲区链接成一个循环队列。
注:以下图示中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区
系统会用两个指针对缓冲区进行管理:
1.in 指针,指向下一个可以冲入数据的空缓冲区,若in指针指向的缓冲区被冲满,那么in会指向下一个空的缓冲区
2.out 指针,指向下一个可以取出数据的满缓冲区,若out指针指向的满缓冲区被取走数据,那么out指针会指向下一个满缓冲区
缓冲池:
缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。
另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(sin)、用于收容输出数据的工作缓冲区(hout)、用于提取输出数据的工作缓冲区(sout)
①当输入进程请求输入数据时,系统从空缓冲队列中取出一块作为收容输入数据的工作缓冲区
(hin)。当这块缓冲区被冲满数据后,将被挂到输入队列队尾
②当计算进程想要取得一块输入数据时,操作系统会从输入队列中取得一块冲满输入数据的缓冲区作为"提取输入数据的工作缓冲区(sin)"。缓冲区读空后挂到空缓冲区队列
③当计算进程想要将准备好的数据冲入缓冲区时,操作系统会从空缓冲队列中取出一块作为“收容输出数据的工作缓冲区(hout)"。数据冲满后将缓冲区挂到输出队列队尾
④输出进程请求输出数据,系统会从输出队列中取得一块冲满输出数据的缓冲区作为"提取输出数据的工作缓冲区(sout)"。缓冲区读空后挂到空缓冲区队列
虽然用户层软件不属于I/O核心子系统,但也做补充:
2.用户层软件中实现
(1)假脱机技术
先来讲讲脱机技术:
在手工操作阶段,主机直接从I/O设备获得数据,由于设备速度慢,主机速度很快。人机速度矛盾明显,主机要浪费很多时间来等待设备。
所以在批处理阶段引入了脱机输入/输出技术(用磁带完成):
引入脱机技术后,程序员可以先通过纸带机将数据输入到磁带中,而磁带的速度比纸带机快很多,而这个输入过程,是由外围控制机实现的。在外围控制机的控制下,慢速输入设备的数据先被输入到更快速的磁带上。之后主机可以从快速的磁带上读入数据,从而缓解了速度矛盾。
数据输出时同理,主机会把数据输出到磁带中,再由外围控制机,将数据输出打印到慢速的磁带机上。
所谓"脱机"就是脱离主机控制进行输入输出操作,在批处理技术中,是由外围控制机来控制输入输出的。
引入脱机技术后,缓解了CPU与慢速I/O设备的速度矛盾。另一方面,即使CPU在忙碌,也可以提前将数据输入到磁带;即使慢速的输出设备正在忙碌,也可以提前将数据输出到磁带。
现在讲假脱机技术:
“假脱机技术”,又称“SPOOLing技术”是用软件的方式模拟脱机技术。SPOOLing 系统的组成如下:
系统会在磁盘上开辟出两个存储区域----"输入井"和"输出井"
系统会在磁盘上开辟出两个存储区域----"输入井"和"输出井"
“输入井”模拟脱机输入时的磁带,用于收容I/O设备输入的数据
"输出井"模拟脱机输出时的磁带,用于收容用户进程输出的数据
外围控制机由一个输入进程与一个输出进程来实现:
输入进程:“输入进程”模拟脱机输入时的外围控制机
输出进程:“输出进程”模拟脱机输出时的外围控制机
当有数据需要从设备输入计算机时,“输入进程”实际是用软件模拟外围控制机,"输入进程"会把要输入的数据放到磁盘的"输入井"中。而"输出进程"就是从磁盘的"输出井"中取出数据到,输出到设备上。
内存中也会开辟"输入缓冲区"和"输出缓冲区":
输入缓冲区:在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中。
输出缓冲区:在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上。
共享打印机的原理:独占式打印机--->共享式打印机
独占式设备----只允许各个进程串行使用的设备。一段时间内只能满足一个进程的请求。
共享设备----允许多个进程“同时”使用的设备(宏观上同时使用,微观上可能是交替使用)。可以同时满足多个进程的使用请求。
打印机是一种"独占式设备",若进程1正在使用打印机,则进程2 请求使用打印机时必然阻塞等待。可以用SPOOLing技术改造成"共享设备"。
当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程为每个进程做两件事:
(1)在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中。
(2)为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的,通俗来说就是打印任务的说明书),再将该表挂到假脱机文件队列上。
当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务。
在采用SPOOLing技术后,虽然系统中只有一个台打印机,但每个进程提出打印请求时,系统都会为在输出井中为其分配一个存储区(相当于分配了一个逻辑设备),使每个用户进程都觉得自己在独占一台打印机,从而实现对打印机的共享。
SPOOLing 技术可以把一台物理设备虚拟成逻辑上的多台设备,可将独占式设备改造成共
享设备。