环形缓冲区

环形缓冲区总结

  1. 避免频繁的内存创建取消、分配。内存一直只用了一块
  2. 在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲区 demo

环形缓冲区的几个基本操作

环形缓冲区 demo 环形缓冲区的基本原理_数据结构_02

如何申请内存空间呢?

申请内存空间

  • 这里定义一个数组,数组的大小有自己来决定

接下来就要对这个数组进行读写操作了,先看看写操作。

写操作

既然是要写操作,就要知道写的地址,

  • 这里的pW就是我们定义的写地址,最开始是指向零地址的

环形缓冲区 demo 环形缓冲区的基本原理_数据结构_03

  • 这里每写入一个地址,指向的地址就会增加一个

环形缓冲区 demo 环形缓冲区的基本原理_java_04


但是这里需要考虑到一个问题,当我们的pW为7的时候,这时候就会越界,这是不允许的,

想想可以用这种方法一般的用法是 if(++size==BUFFER_SIZE) size=0;
当越界时候,又从头开始

下面推荐一种方法

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲区 demo_05

这种写法更加好一点,当pW=7的时候,(pW+1)% 8 =0,如下所示

环形缓冲区 demo 环形缓冲区的基本原理_c语言_06

读操作

读操作和写操做是一样的

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲_07

环形缓冲区小结

环形缓冲区有四个要素,宏定义除外把这三个要素定义在结构体里

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲区 demo_08


在读写操作的时候需要判断我们的缓冲区是否为空或者是否为满,如何判断呢???

判断缓冲区是否为空

假设我们写了四个数据,这时候pW等于4

环形缓冲区 demo 环形缓冲区的基本原理_数据结构_09

假如我们读取了这四个数据,这时候就没有要读取的数据了,环形缓冲区的数据为空,这时候pR=pW=4;所以,只需要判断环形缓冲区读写地址是否相同就可以判断环形缓冲区里面是否为空------------pR==pW;则为空

环形缓冲区 demo 环形缓冲区的基本原理_c语言_10

判断缓冲区是否写满

假设当我们在写到第七位的时候,再写一位,这时候,pw=pR这时候为空???,但是这时候已经是写满了,找到一种合适的计算方法就是:(pW+1)%BUFFER_SIZE == pR 当满足这个条件的时候,就证明已经写满了,将要写的数据丢弃掉

环形缓冲区 demo 环形缓冲区的基本原理_数据结构_11

接下来开始写环形缓冲区:

构建环形缓冲区

在.h文件中声明结构体

环形缓冲区 demo 环形缓冲区的基本原理_java_12

在.c文件中定义函数

初始化环形缓冲区

缓冲区最开始无读写数据,都指向0

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲区 demo_13

写缓冲区

需要满足条件时候才写,写满了不操作,丢弃掉

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲区 demo_14

读缓冲区

这里也有限制条件,缓冲区有数据的时候才读

环形缓冲区 demo 环形缓冲区的基本原理_环形缓冲_15

这里就三个函数,把这三个函数声明在.h文件中声明,以便别的函数调用。

构建环形缓冲区这两个文件放在仓库了