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