【概述】
现代 OS 中,几乎所有的 I/O 设备都在于处理机交换数据时用了缓冲区
缓冲是一个存储区域,其由专门的硬件寄存器组成,但由于硬件的成本较高,一般仅用在速度要求非常高的场合
在一般情况下,更多的是利用内存作为缓冲区
引入缓冲区的原因有很多,可归结于以下几点:
- 缓和 CPU 与 I/O 设备间不匹配的矛盾
- 减少 CPU 的中断频率,放宽 CPU 中断响应时间的限制
- 解决数据粒度不匹配问题
- 提高 CPU 与 I/O 设备间的并行性
随着设备速度差距越大,缓冲区容量也就越大,因此使用缓冲区的方式可归结为三类:
- 单缓冲与多缓冲
- 循环缓冲
- 缓冲池
【单缓冲与多缓冲】
单缓冲
单缓冲的情况下,用户进程每发出一 I/O 请求时,OS 便在主存中为之分配一缓冲区
缓冲区由 CPU 和外设轮流使用,一方处理完后等待对方处理
当字符设备输入时,缓冲区用于暂存用户输入/输出的一行数据;当块设备输入时,缓冲区用于暂存用户输入/输出的一块数据
多缓冲
由于缓冲是共享资源,为加快输入和输出速度,提高设备利用率,又引入了双缓冲机制,也称缓冲对换
在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区,此时 OS 可以从第一缓冲中移出数据,并送入用户进程,接着由 CPU 对数据进行计算
【循环缓冲区】
当输入输出速度基本匹配时,双缓冲能获得很好的效果,但当输入输出两者速度相差甚远时,双缓冲的效果则不够理想
为进一步协调速度差,可增加缓冲区数量,并将多个缓冲区组织成环形缓冲区的形式
循环缓冲区具有多个大小相同的缓冲区,分为三种类型:
- 预备装输入数据的空缓冲区 R
- 装满数据的缓冲区 G
- 计算进程正在使用的现行工作缓冲区 C
【缓冲池】
目前广泛流行的是既可用于输入又可用于输出的公用缓冲池,池中设置了多个可供若干进程共享的缓冲区
缓冲池与缓冲区的主要区别在于:缓冲区仅是一组内存块的链表,缓冲池则是一种用于管理多个缓冲区的管理机制,其包含了一个管理的数据结构和一组操作函数
组成
缓冲池管理着多个缓冲区,为管理方便,一般将缓冲池吃中具有相同类型的缓冲区链成队列,因此可形成以下三个队列:
- 空白缓冲队列 emq:由空缓冲区链成的队列
- 输入队列 inq:由装满输入数据的缓冲区链成的队列
- 输出队列 outq:由装满输出数据的缓冲区链成的队列
除上述三个队列外,还应具有以下四类工作缓冲区:用于收容数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收入输出数据的工作缓冲区、用于提取输出数据的工作缓冲区
缓冲池的工作方式
缓冲区在缓冲池中有如下四种工作方式:
- 收容输入:用于完成收容输入数据的工作
- 提取输入:用于完成提取输入数据的工作
- 收容输出:用于完成收容输出数据的工作
- 提出输出:用于完成提取输出数据的工作