缓冲技术是为了协调吞吐速度相差很大的设备之间
数据传送而采用的技术。
简要介绍
通常CPU的速度要比I/O设备的速度快得多得多,所以可以设置
缓冲区,对于从CPU来的数据,先放在缓冲区中,然后设备可以慢慢地从缓冲区中读出数据。常见的
缓冲技术有:单缓冲,
双缓冲,循环缓冲,
缓冲池。其中,广泛流行使用公用缓冲池。
引入
在操作系统中,引入
缓冲的主要原因,可归结为以下几点:
1.改善CPU与I/O设备间速度不匹配的矛盾
例如一个程序,它时而进行长时间的计算而没有输出,时而又阵发性把输出送到打印机。由于打印机的速度跟不上CPU,而使得CPU长时间的等待。如果设置了
缓冲区,程序输出的数据先送到缓冲区暂存,然后由打印机慢慢地输出。这时,CPU不必等待,可以继续执行程序。实现了CPU与I/O设备之间的并行工作。事实上,凡在数据的到达速率与其离去速率不同的地方,都可设置
缓冲,以缓和它们之间速度不匹配的矛盾。众所周知,通常的程序都是时而计算,时而输出的。
2. 可以减少对 CPU的中断频率,放宽对
中断响应时间的限制
如果I/O操作每传送一个字节就要产生一次中断,那么设置了n个字节的
缓冲区后,则可以等到缓冲区满才产生中断,这样中断次数就减少到1/n,而且
中断响应的时间也可以相应的放宽。
缓冲的引入可显著提高 CPU和设备的并行操作程度,提高系统的吞吐量和设备的利用率。
一种是采用专用硬件
缓冲器一种是在内存划出一个具有n个单元的专用缓冲区,以便存放输入/输出的数据。内存
缓冲区又称软件缓冲。
种类
单
缓冲:在设备和
处理机之间设置一个
缓冲器。设备相
处理机交换数据时,先把被交换数据写入
缓冲器,然后,需要数据的设备或处理机从缓冲器取定数据。由于缓冲器属于
临界资源,即不允许多个进程同时对一个缓冲器操作,因此,尽管单缓冲能匹配设备相
处理机的处理速度,但是,设备和设备之间不能通过单缓冲达到并行操作。
双缓冲:解决两台外设、打印帆和终端之间的并行操作问题的办法是设置双缓冲。有了两个
缓冲器之后,CPU可把输出到打印机的数据放入其中一个缓冲器(区)、让打印机慢慢打印;然后,它又可以从另一个为终端设置的缓冲器(区)中读取所需要的输入数据。
多
缓冲:是把多个缓冲区连接起来组成两部分,一部分专门用于输入,另一部分专门用于输出的缓冲结构。
缓冲池:把多个缓冲区连接起来统一管理,既可用于输入又可用于输出的缓冲结构。
缓冲池的管理
结构
而一个
缓冲区由两部分组成:一部分是用来标识该缓冲器和用于管理的缓冲首部,另一部分是用于存放数据的缓冲体。这两部分有一一对应的映射关系。对
缓冲池的管理是通过对每一个缓冲器的缓冲首部进行操作实现的。
缓冲首部包括设备号、设备上的
数据块号(块设备时)、互斥标识位以及缓冲
队列连接
指针和缓冲器号等。
(1) 空白
缓冲队列em,其队首指针为F(em),队尾指针为L(em);
(2) 装满输入数据的输入
缓冲队列in,其队首
指针为F(in),队尾指针为L(in);
(3) 装满输出数据的输出
缓冲队列out,其队首
指针为F(out),队尾指针为L(out)。
(3) 用于收容输出数据的工作
缓冲区(hout);
(4) 用于提取输出数据的工作
缓冲区(sout)。 可见,
缓冲区工作在收容输入、提取输入、收容输出和提取输出四种工作方式如下:
管理
(1)从三种
缓冲区
队列中按一定的选取规则取出一个缓冲区的过程take_buf(type);
(2)把
缓冲区按一定的选取规则插入相应的缓冲区
队列的过程add_buf(type,number);
(3)供进程申请
缓冲区用的过程get_buf(type,number);
(4)供进程将
缓冲区放入相应缓冲区队列的过程put_buf(type,work_buf)。
其中,参数type表示
缓冲队列类型,number为缓冲区号,而work_buf则表示工作缓冲区类型。
工作过程
首先,输入进程调用get_uf(em,number)过程从空白
缓冲区队列中取出一个缓冲号为number的空白缓冲区,将其作为收容输入缓冲区hin,当hin中装满了由
输入设备输入的数据之后,系统调用过程put_buf(in,hin)将该缓冲区插入输入缓冲区队列in中。
另外,当进程需要输出数据数据时,输出进程经过
缓冲管理程序调用过程get_buf(em,number)从空白缓冲区队列中取出一个空白缓冲区number作为收容输出缓冲区hout,待hout中装满输出数据之后,系统再调用过程Put_buf(out,hout)将该缓冲区插入输出缓冲区队列out.
对
缓冲区的输入数据和输出数据的提取也是由过程get_buf和put_buf实现的。get_buf(out,number)从输出
缓冲队列中取出装满输出数据的缓冲区number,将其作为sout。当sout中数据输出完毕时,系统调用过程put_buf(em,sout)将该
缓冲区插入空白缓冲队列。而get_buf(in,number)则从输入
缓冲队列中取出一个装满输入数据的缓冲区number作为输入缓冲区sin,当CPU从中提取完所需数据之后,系统调用过程put_buf(em,sin)将该缓冲区释放和插入空白缓冲队列em中。