什么是环形缓冲区?
如何在代码中实现环形缓冲区?
环形缓冲区适用于甚麽样的场合?
队列
#define QueueSize 40 // 队伍容量
typedef struct{
DataType queue[QueueSize];// 用于保存类型为DataType队列元素的数组
int front,rear;// 用于保存队头和队尾下标信息
}SeqQueue;
队列——普通队列和环形队列
指针的初始值
环形队列(front,rear=0)
队列(front,rear=-1)
添加与取出元素
环形队列(先改变值,后操作数组)
队列(后改变值,先操作数组)
#include <stdio.h>
#define MAX_SIZE 10
int queue[MAX_SIZE];
int rear = -1;
int front = -1;
int InQueue(int value)
{
if(rear >= MAX_SIZE-1)
return 0;
rear ++;
queue[rear] = value;
return 1;
}
int OutQueue(int *value)
{
if(front == rear)
return 0;
front ++;
*value = queue[front];
return 1;
}
void main()
{
int temp;
while(1)
{
printf("1:存取;2:读取;=》:");
scanf("%d",&temp);
fflush(stdin);
if(temp == 1)
{
printf("请输入要存入的值:");
scanf("%d",&temp);
fflush(stdin);
if(InQueue(temp) == 1)
printf("插入队列成功\n");
else
printf("队列已满\n");
}else if(temp == 2)
{
if(OutQueue(&temp))
{
printf("读取队列的值为:%d\n",temp);
}else
printf("队列为空\n");
}else
break;
}
}
环形缓存区:
环形缓冲器(ringr buffer),也称作圆形队列(circular queue),循环缓冲区(cyclic buffer),圆形缓冲区(circula buffer),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。
背景:
当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如过要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。
环形队列
目的:避免频繁的内存创建取消、分配。内存一直只用了一块。
队列有着先入先出的特性。但是对于队列如果删除队头以后剩下的空间将不会被释放,又由于队列只能由队尾插入这就导致被删除部分的空间被浪费。解决这个问题就是循环队列。循环队列顾名思义就是将队列串起来形成一个类似与环的结构
不同于一般常见的队列,环形队列首尾相连,通过移动指针来控制队列中内容的读写。
这样做有什么好处呢?
最大的好处是环形队列出队(读取)后,不需要对后续队列内容进行搬移,可以后续由入队(写入)覆盖。
下面来看下一种常见的实现方式, 通过读写指针计数来实现环形队列
https://blog.youkuaiyun.com/newbmiao/article/details/120052386?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164455834616780271510849%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164455834616780271510849&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-11-120052386.first_rank_v2_pc_rank_v29&utm_term=ring+buffer+%E5%92%8C%E9%98%9F%E5%88%97&spm=1018.2226.3001.4187
ring buffer 数据结构
struct _RingB
{
SI32 r_cursor;
SI32 w_cursor;
SI32 tr_cursor;
SI32 tw_cursor;
SI32 length;
char data[0];
};
ring queue 数据结构
struct _RingQ
{
SI32 r_cursor;
SI32 w_cursor;
SI32 length;
void* data[0];
};
图解RingBuffer数据结构
本篇介绍一种简单高效的数据缓存结构: RingBuffer, 这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。