6.7 缓冲区管理

L39

学习目标

缓冲区缓解CPU与I/O设备速度差异,从单缓冲到缓冲池逐步提高并行度。

  • 缓冲的引入:缓解CPU与I/O设备速度不匹配的矛盾,减少中断次数,提高系统吞吐量。
  • 单缓冲区和双缓冲区:单缓冲区每次只能缓冲一个数据块;双缓冲区可交替使用实现并行操作。
  • 循环缓冲区:多个缓冲区组成循环队列,生产者和消费者分别操作指针。
  • 缓冲池:多个缓冲区组成公用缓冲池,供多个进程共享使用,提高缓冲区利用率。

原理 · 深入理解

6.7 缓冲区管理

本节概览:先建立「缓冲区管理」的框架,再依次展开下列小节。

  1. 缓冲的引入
  2. 单缓冲区和双缓冲区
  3. 环形缓冲区
  4. 缓冲池(Buffer Pool)

6.7.1 缓冲的引入

引入缓冲区的原因可归结为以下几点。

  1. 缓和CPU与I/O设备间速度不匹配的矛盾
  2. 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
  3. 解决数据粒度不匹配的问题
  4. 提高CPU和I/O设备之间的并行性
图6-22 利用缓冲寄存器实现缓冲 设备 缓冲寄存器 CPU
图6-22 利用缓冲寄存器实现缓冲

6.7.2 单缓冲区和双缓冲区

由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。如果消费者尚未取走缓冲区中的数据,即使生产者又生产出新的数据也无法将它送入缓冲区,生产者等待。

如果为生产者与消费者设置了两个缓冲区,便能解决这一问题。

图6-23 单缓冲工作示意图 进程 缓冲 1 设备 CPU 与设备速度差靠缓冲缓和
图6-23 单缓冲工作示意图

在单缓冲情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区。

图6-24 双缓冲工作示意图 进程 缓冲 1 缓冲 2 设备 CPU 与设备速度差靠缓冲缓和
图6-24 双缓冲工作示意图

如果在实现两台机器之间的通信时仅为它们配置了单缓冲,那么它们之间在任一时刻都只能实现单方向的数据传输。

为实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区。

图6-25 双机通信时缓冲区的设置 进程 缓冲 1 缓冲 2 设备 两边各设缓冲,发送和接收可以重叠
图6-25 双机通信时缓冲区的设置

6.7.3 环形缓冲区

环形缓冲区由多个缓冲区和多个指针组成。每个缓冲区大小相同。

作为输入的多缓冲区可分为三种类型:用于装输入数据的空缓冲区R、已装满数据的缓冲区G、计算进程正在使用的现行工作缓冲区C。

作为输入的缓冲区可设置三个指针:指示计算进程下一个可用缓冲区G的指针Nextg、指示输入进程下次可用的空缓冲区R的指针Nexti、指示计算进程正在使用的缓冲区C的指针Current。

图6-26 环形缓冲区 in 缓冲环 out 一组缓冲区首尾相接
图6-26 环形缓冲区

环形缓冲区使用中存在进程之间的同步问题。

计算进程和输入进程可利用下述两个过程来使用环形缓冲区。使用输入循环缓冲可使输入进程和计算进程并行执行,相应地指针Nexti和Nextg将不断沿顺时针方向移动,可能出现下述两种情况。

  1. Getbuf过程
  2. Releasebuf过程
  3. Nexti指针追赶上Nextg指针
  4. Nextg指针追赶上Nexti指针

6.7.4 缓冲池(Buffer Pool)

缓冲池管理着多个缓冲区,每个缓冲区由用于标识和管理的缓冲首部以及用于存放数据的缓冲体两部分组成。缓冲首部一般包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列链接指针等。

为管理方便,一般将缓冲池中具有相同类型的缓冲区链接成一个队列,于是可形成以下三个队列。

  1. 空白缓冲队列emq
  2. 输入队列inq
  3. 输出队列outq
单缓冲 / 双缓冲 / 缓冲池 单缓冲 产/消互斥等待 双缓冲 交替填充 缓冲池 空/满队列

为使各进程互斥地访问缓冲池队列,可为每一队列设置一个互斥信号量MS(Type)。为保证各进程同步使用,又为每个缓冲队列设置一个资源信号量RS(Type)。既可实现互斥又可保证同步的Getbuf过程和Putbuf过程描述如下:

Getbuf过程:Wait(RS(type)); Wait(MS(type)); B(number)=Takebuf(type); Signal(MS(type))

Putbuf过程:Wait(MS(type)); Addbuf(type,number); Signal(MS(type)); Signal(RS(type))

缓冲区可以工作在如下四种工作方式。

图6-27 缓冲区的工作方式 收容输入 提取输入 收容输出 提取输出
图6-27 缓冲区的工作方式

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

缓冲区管理

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能说明双缓冲的好处。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • RGB 帧缓冲算哪类缓冲?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表