7.2.6 缓冲技术
中断和通道的引入为CPU与外设之间的并行操作提供了可能性,但CPU与外设之间速度不匹配,以及外设频繁中断CPU的运行,仍会降低CPU的使用效率。缓冲技术主要用于匹配设备与CPU之间的处理速度。处理数据到达速度与离去速度不一致而采用的技术称为缓冲。
1.引入缓冲的主要原因
·缓和CPU与I/O设备之间速度不匹配的矛盾。
·减少对CPU的中断频率,放宽对中断响应时间的限制。
·提高CPU与I/O设备之间的并行性。
·协调传输数据大小不一致的设备。
2.缓冲的种类
根据缓冲区是由硬件还是软件实现,可以分为硬缓冲区和软缓冲区。硬缓冲区通常设在设备中,如设在打印机中。软缓冲通常是在内存设置缓冲区,通常在内存开辟一个称为I/O缓冲区的存储区,用于临时存放I/O操作的数据。若不做特殊说明,缓冲区一般指软缓冲区。缓冲区是临界资源,需要互斥操作缓冲区或缓冲队列。
根据系统设置的缓冲区个数,将缓冲的模式分为:单缓冲、双缓冲、多缓冲和缓冲池。
(1)单缓冲
单缓冲是在设备和处理机之间设置一个缓冲区。设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区中取走数据,如此反复,直到输入任务完成。由于只设置了一个缓冲区,不能明显改善CPU与外部设备的并行性。
(2)双缓冲
双缓冲区可以解决并行操作的问题。在设备输入时,先将数据输入第一个缓冲区,装满后便转向第二个缓冲区,在向第二个缓冲区送数据的同时,CPU可以对第一个缓冲区中的数据进行计算。
双缓冲区只是一种说明设备和设备、CPU和设备并行操作的简单模型,并不能用于实际系统中的并行操作。因为计算机系统中的外围设备较多,此外,当输入、输出或生产者、消费者的速度基本相匹配时,采用双缓冲能获得较好的效果,但当两者的速度相差甚远时,双缓冲区就很难匹配设备和处理机的处理速度。
(3)多缓冲
多缓冲是将多个缓冲区连接起来组成两部分,一部分专用于输入,另一部分专用于输出。一般将多缓冲区组织成循环缓冲的模式。循环缓冲包括多个缓冲区和多个指针。每个缓冲区的大小相同。并且每个缓冲区有一个指针用以指示下一个缓冲区的地址,最后一个缓冲区指针指向第一个缓冲区地址,这样N个缓冲区就形成了一个环状。
(4)缓冲池
前3种缓冲只适用于某个特定的I/O进程和计算进程,属于专用缓冲区。为了提高缓冲区的利用率,可采用公用缓冲池,将系统中所有缓冲区集中起来统一管理,构成缓冲池(或缓冲区队列)。缓冲池属于操作系统空间,用户程序不能直接对其操作,只能通过系统调用间接使用。
1)缓冲池的组成。缓冲池是既可用于输入,又可用于输出的缓冲结构。其中至少应含有以下3种类型的缓冲区:空缓冲、装满输入数据的输入缓冲区、装满输出数据的输出缓冲区。
系统将各种缓冲区按其使用状况连接成3种队列:
·空缓冲队列emq,其队首指针为F(emq),队尾指针为L(emq)。
·装满输入数据的输入缓冲队列inq,其队首指针为F(inq),队尾指针为L(inq)。
·装满输出数据的输出缓冲队列outq,其队首指针为F(outq),队尾指针为L(outq)。
除了上述3种队列外,还应具有4种工作缓冲区:
·用于收容设备输入数据的收容输入缓冲区hin。
·用于提取设备输入数据的提取输入缓冲区sin。
·用于收容CPU输出数据的收容输出缓冲区hout。
·用于提取CPU输出数据的提取输出缓冲区sout。
2)缓冲池的管理。对缓冲区的管理主要由如下几个操作组成,其中,参数type表示缓冲队列类型,number为缓冲区号,work_type表示工作缓冲区类型。
·take_buf(type):从Type指示的某个队列中摘下一个缓冲区。
·add_buff(type,number):将由number指向的缓冲区插入某个Type的缓冲区队列中。此外,还有两个实现互斥和同步的操作get_buf和put_buf。
·get_buf(type,number):申请缓冲区。
·put_buf(type,work_buf):将缓冲区放入相应缓冲队列。
因为队列本身是临界资源,所以多个进程在访问一个队列时,需要互斥和同步操作。为此可为每一队列设置一个互斥信号量S(type),初值为1。为了使进程同步使用缓冲区,又为每个缓冲队列设置了一个描述资源数目的信号量RS(type),其初值为N(N为type队列长度)。get_buf过程和put_buf过程描述如下:
get_buf(type,number)
begin
P(RS(type));
P(S(type));
Pointer of buffer(number)=take_buf(type)
V(S(type))
end
put_buf(type,number)
begin
P(S(type));
add_buf(type,number);
V(S(type))
V(RS(type))
end