在现代OS中,几乎所有的I/O设备在与处理机(内存)交换数据时,都使用了缓冲区。因
为提高I/O速度和设备的利用率,在很大程度上都需要借助于缓冲技术来实现。缓冲管理的主要
功能是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
OS提供以下几种缓冲形式:
缓冲的引入
在操作系统中,引入缓冲的主要原因,可归纳为以下三点:
缓和CPU与I/O设备间速度不匹配的矛盾;
减少对CPU的中断频率,防宽对中断响应时间的限制;
提高CPU和I/O设备之间的并行性;
△ 利用缓冲寄存器实现缓冲
单缓冲
单缓冲是OS提供的最简单的一种缓冲形式。每当一个用户进程发出一I/O请求时,操
作系统便在主存中为之分配一缓冲区,如下图(a):
在块设备输入时,缓冲区用于暂存块
设备输入的一块数据;
在字符设备输入时,缓冲区用于暂存
用户输入的一行数据。
双缓冲
为了加快输入、输出速度和提高设备利用率,又引入了双缓冲工作方式,也称为缓冲
对换(Buffer Swapping)方式。如下图(b):
在设备输入时,先将数据输入第一缓
冲区,装满后便转向第二缓冲区。
此时操作系统可从第一缓冲区中移出
数据送用户进程区,接着由CPU对数据进
行计算。
如果我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,如下图(a):
为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,分别用作发送和接收缓
冲区。如上图(b):
循环缓冲
当输入、输出或生产者--消费者的速度相差甚远时,双缓冲的效果则不够理想,但可
以增加缓冲区数量而使情况有所改善。因此,引入了多缓冲,并将多缓冲组织成循环缓冲形
式。如下图(c):
循环缓冲的组成
多个缓冲区
在循环缓冲中含有多个缓冲区,每个缓冲区的大小相同。缓冲区可分成三种类型:
空缓冲区R;
已装满数据的缓冲区G;
现行工作缓冲区C;
多个指针
Nextg----指示计算进程下一个可用的缓冲区G;
Nexti----指示输入进程下次可用的空缓冲区R;
Current----指示计算进程正在使用的缓冲区单元。
循环缓冲的组成如下图:
缓冲区的使用
计算进程和输入进程可利用下述两个过程来使用循环缓冲区:
Getbuf过程
Releasebuf过程
进程同步
使用输入缓冲可使输入进程和计算进程并行执行。相应地,指针Nexti和Nexitg将不
断地沿顺时针方向移动,这样就可能出现下述两种情况:
Nexti 指针追赶上Nextg 指针
Nextg 指针追赶上Nexti 指针
缓冲池
上述的循环缓冲属专用缓冲。当系统较大时,为了提高缓冲区的利用率,目前广泛流
行公用缓冲池,池中的缓冲区可供多个进程共享。
缓冲池(Buffer Pool)的组成
对于既可用于输入和输出的公用缓冲区,至少应含有以下三种类型的缓冲区:
空(闲)缓冲区; 装满输入数据的缓冲区; 装满输出数据的缓冲区;
为了管理上的方便,可将相同类型的缓冲区链成一个队列,形成以下三个队列:
空缓冲队列emq;
输入队列inq;
输出队列outq;
除了上述三种(个)队列外,还应具有四种工作缓冲区:
用于收容输入数据的工作缓冲区;
用于提取输入数据的工作缓冲区;
用于收容输出数据的工作缓冲区;
用于提取输出数据的工作缓冲区;
Getbuf过程和Putbuf过程
为使诸进程能互斥地和同步地访问缓冲池队列,可分别为每一队列设置一个互斥信号
量MS(type)和资源信号量RS(type),过程描述如下:
缓冲区的工作方式
缓冲区可以工作在收容输入、提取输入、收容输出、提取输出四种工作方式下,如下
图: