首页 理论教育 计算机操作系统中的缓冲池管理及组成

计算机操作系统中的缓冲池管理及组成

时间:2023-11-06 理论教育 版权反馈
【摘要】:6.3.3 缓冲池管理1.缓冲池的组成对于既可用于输入又可用于输出的公用缓冲池,至少应包含有以下三类的缓冲区:空(闲)缓冲区。

计算机操作系统中的缓冲池管理及组成

虽然中断、DMA和通道控制技术的使用使系统中设备与设备、设备与CPU等得以并行工作,但是I/O设备与CPU的处理速度不匹配问题依然客观存在,从而限制了CPU连接外设的数量,并且在中断方式时造成数据的丢失,制约了计算机系统性能的提高。于是现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都采用了设置缓冲区(器)的方法,因此设备管理的一项主要功能是缓冲管理,缓冲管理的主要职责是组织好缓冲区,并提供获得和释放缓冲区的手段。

6.3.1 缓冲的引入

缓冲区引入的主要原因为以下几点:

(1)缓和CPU与I/O设备间速度不匹配的矛盾,提高CPU和I/O设备之问的并行性。由于CPU的处理速率远远高于I/O设备的数据传送速率,如果没有缓冲区,当计算进程大批量输出数据时,必然会因打印机的速度跟不上而使CPU停下来等待;而在计算进程计算时,打印机又因无数据输出而空闲无事。显然,如果在打印机或控制器中设置一缓冲区,用于暂存进程的输出数据,以后CPU转去做其他工作时,由打印机“慢慢地”从中取出数据打印,这样可使打印机与CPU并行工作,提高CPU的工作效率,提高CPU和I/O设备间的并行操作程度,从而提高系统的吞吐量和设备的利用率。同样,在输入设备与CPU之间设置缓冲区,也可使系统的工作效率得以提高。因此,凡在数据到达速率与其离去速率不同的地方,都可设置缓冲区,以缓和它们之间速率不匹的矛盾。

图6-10 利用缓冲寄存器实现缓冲

(2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制。如果将I/O控制器中一个字符的缓冲区增加到可存放100个字符,则I/O控制器对CPU的中断可以延长到100个字符的缓冲区装满后才发出一次中断请求,否则每个字符输入完毕均会产生中断。同样,在远程通信系统中,如果从远程终端发来的数据仅用一位缓冲来接收,则必须在每收到一位数据时便中断一次CPU,这样对于速率为9.6 KB/s的数据通信来说,就意味着其中断CPU的频率也为9.6 KB/s,即每100μs就要中断CPU一次,而且CPU必须在100μs内予以响应,否则缓冲区内的数据将被冲掉,如图6-10a所示,若设置一个具有八位的移位(缓冲)寄存器,如图6-10b所示,则可使CPU被中断的频率降低为原来的1/8,但此时CPU对中断的响应时间仍为100μs,若再设置一个八位缓冲寄存器,如图6-10c所示,则又可把CPU对中断的响应时间延长8倍,放宽到800μs,从而减少设备对CPU的中断频率,并延长CPU中断响应的限制时间。

6.3.2 缓冲的种类

根据I/O控制方法,缓冲的实现方法有两种:一种是采用专用硬件缓冲器,I/O控制器的数据缓冲寄存器;另一种方法是在内存中辟出专用区域作为缓冲区,操作系统管理下用来服务于各种I/O设备,内存缓冲区又称软件缓冲。

根据系统设置的缓冲器的个数,缓冲的种类有单缓冲、双缓冲、多缓冲。

6.3.3 缓冲池管理

1.缓冲池的组成

对于既可用于输入又可用于输出的公用缓冲池,至少应包含有以下三类的缓冲区:

(1)空(闲)缓冲区。

(2)装满输入数据的缓冲区。

(3)装满输出数据的缓冲区。

系统把相同类型的缓冲区链成一个队列,于是可形成以下三个队列:

(1)空缓冲队列cmq。这是由空缓冲区所链成的队列,其队首指针为F(emq),队尾折针为L(emq)。

(2)装满输入数据的缓冲区所链成输入缓冲队列inq。其队首指针为F(inq),队尾指针为L(inq)。

(3)装满输出数据的缓冲区所链成的输出队列outq。其队首指针为F(outq),队尾指针为L(outq)。

系统或用户进程从上述三个队列中申请和取出缓冲区,并用得到的缓冲区进行存、取数据操作,在操作结束后,再将缓冲区放入相应的队列,这些申请得到的缓冲区被称为工作缓冲区,在缓冲池中有以下四种工作缓冲区,分别工作在四种方式下,如图6-11所示。

(1)用于收容设备输入数据的工作缓冲区hin,工作在收容输入方式下。

(2)用于提取设备输入数据的工作缓冲区sin,工作在提取输入方式下。

(3)用于收容CPU输出数据的工作缓冲区hout,工作在收容输出方式下。

(4)用于提取CPU输出数据的工作缓冲区sout,工作在提取输出方式下。

2.缓冲池管理

缓冲池的管理由如下四个过程完成:

(www.xing528.com)

图6-11 缓冲池中工作缓冲区的工作方式

(1)Addbuf(type,number)过程。用于将由参数number所指示的缓冲区挂在type队列上。

(2)Takebuf(type)过程。该过程用于从type所指示的队列的队首摘取一个缓冲区。

(3)Getbuf(type)过程。进程申请缓冲区的过程。

(4)Putbuf(type,workbuf)过程。进程将缓冲区放入相应缓冲区队列的过程。

其中参数type表示缓冲队列类型,number为缓冲区号,workbuf表示工作缓冲区类型。

因为缓冲池中的队列是临界资源,多个进程在访问一个队列时既应互斥,又须同步,因此为每一个缓冲区队列设置了一个互斥信号量MS(typc),又为每个缓冲区队列设置了一个资源信号量RS(type),Addbuf(type,number)过程和Takebuf(type)过程分别被Getbuf(type)过程和Putbuf(type,workbuf)过程调用,既可实现互斥又可保证同步的Getbuf过程和Putbuf过程描述如下:

Procedure Getbuf(type)

begin

Wait(RS(type));

Wait(MS(typc));

B(number):=Takebuf(type);

Signal(MS(type));

end

Procedure Putbuf(type,number)

begin

Wai t(MS(type));

Addbuf(type,number);

Signal(MS(type));

Signal(RS(type));

end

缓冲池的工作在cmq、inq和outq三个队列,以及Getbuf(type)和Putbuf(type,workbuf)两个过程下完成,工作缓冲区在收容输入、提取输入、收容输出和提取输出四种工作方式下的工作过程如下:

(1)收容输入。在输入进程需要从设备输入数据时,调用Getbuf(emq)过程,从空缓冲队列emq的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区hin,然后把数据输入其中,装满后再调用Putbuf(inq,hin)过程,将该缓冲区挂在输入队列inq上。

(2)提取输入。当计算进程需要输入数据时,调用Getbuf(inq)过程,从输入队列inq的队首摘取一个缓冲区,作为提取输入工作缓冲区sin,计算进程从中提取数据,数据提取完毕后,再调用Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列emq上。

(3)收容输出。当计算进程需要输出CPU的计算数据时,调用Getbuf(emq)过程从空缓冲队列emq的队首取得一个空缓冲区,作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq,hout)过程,将该缓冲区挂在outq队尾。

(4)提取输出。由输出进程调用Getbuf(outq)过程,从输出队列的队首摘取一个装满输出数据的缓冲区,作为提取输出工作缓冲区sout,在数据提取完后,再调用Putbuf(emq,sout)过程,将该缓冲区挂在空缓冲队列末尾。

上述缓冲区队列的管理方法采用的是FIFO(先进先出)的方法,也可视情况采用其他的缓冲区队列管理策略。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈