环形缓冲区

news2024/9/25 21:25:06

文章目录

  • 一. 什么是环形缓冲区?
  • 二、实现环形缓冲区:
  • 三、环形缓冲区示例代码:
  • 总结


一. 什么是环形缓冲区?

环形缓冲区 是一段 先进先出 的循环缓冲区,有一定的大小,我们可以把它抽象理解为一块环形的内存。

我们使用环形缓冲区主要有两个原因;
(1)当我们要存储大量数据时,我们的计算机只能处理先写入的数据,处理完毕释放数据后,后面的数据需要前移一位,大量的数据会频繁分配释放内存,从而导致很大的开销。使用环形缓冲区 可以减少内存分配继而减少系统的开销。

(2)如果我们频繁快速的持续向计算机输入数据,计算机可能执行某个进程不能及时的执行输入的数据,导致数据丢失。这时,我们可以将要输入的数据放入环形缓冲区内,计算机就不会造成数据丢失。


二、实现环形缓冲区:

  1. 通常我们定义一个一定大小的数组,当作我们的环形缓冲区。数组的长度我们可以随意定义。
#define BUF_LEN 128
static int g_keys[BUF_LEN];
  1. 抽象来说 环形缓冲区有两个指针,分别是 读指针 r, 写指针 w。最初一起指向内存的起始处。
    这里我们可以直接定义为 int 类型。
static int r, w;

如果写入一个数据,写指针 w 就会向后移动一位 ;如果读一个数据,读指针 r 就也会向后移动一位

如果缓冲区是 空 的,则不能进行 读 操作;如果缓冲区是 满 的,则不能进行 写 操作。那么如何判断缓冲区是什么时候空,什么时候满呢?

在这里插入图片描述

  1. 环形缓冲区 r = w 读指针 等于 写指针
static int is_key_buf_empty(void)
{
	return (r == w);
}

环形缓冲区 读指针 等于 下一个写指针

#define NEXT_POS(x) ((x+1) % BUF_LEN)

static int is_key_buf_full(void)
{
	return (r == NEXT_POS(w));
}

其实当缓冲区是空的 和 当缓冲区是满的 时,都可以理解为 读指针 等于 写指针(r = w ),
但是为了我们便于分辨 缓冲区的空,满,我们退一步认为,当读指针 等于 下一个写指针 时,缓冲区时满的。


三、环形缓冲区示例代码:

当 缓冲区是非空 的,进行 读 操作;如果缓冲区是 非满 的,进行 写 操作。

/* 环形缓冲区 */
#define BUF_LEN 128
static int g_keys[BUF_LEN];
static int r, w;

#define NEXT_POS(x) ((x+1) % BUF_LEN)

static int is_key_buf_empty(void)
{
	return (r == w);
}

static int is_key_buf_full(void)
{
	return (r == NEXT_POS(w));
}

static void put_key(int key)  //写
{
	if (!is_key_buf_full())
	{
		g_keys[w] = key;
		w = NEXT_POS(w);
	}
}

static int get_key(void)    //读
{
	int key = 0;
	if (!is_key_buf_empty())
	{
		key = g_keys[r];
		r = NEXT_POS(r);
	}
	return key;
}

总结

环形缓冲区非常实用,不难理解,主要是要记住环形缓冲区满的标志,环形缓冲区为空的标志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速掌握web服务器相关知识

目录 1.web服务器 2.HTTP的状态码 3.web实验 4.算法介绍 1.web服务器 web服务器指网站服务器,是指驻留与因特网上某种类型计算机的程序,可以向浏览器等WEB客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置…

关于batchnormlization理解

论文一般是这两张典型图片引用wz博客辅助理解上图展示了一个batch size为2(两张图片)的Batch Normalization的计算过程,假设feature1、feature2分别是由image1、image2经过一系列卷积池化后得到的特征矩阵,feature的channel为2&am…

TCP三次握手和四次挥手

三次握手 先ping域名为www.baidu.com,便于DNS解析。ping走的协议就包括DNS、ARP和ICMP。 接着使用Wireshark去抓包,抓包这里导航栏直接过滤ip就可以了,输入ip.host 183.232.231.174 接着直接在浏览器输入百度域名www.baidu.com访问请求&am…

TikTok新规:严禁录播盗播,保护原创内容

让我们一起来看看今日都有哪些新鲜事吧!01 2023年,TikTok将在社交买家渗透率和用户使用时间上面成为美国第一 eMarketer最新预测显示,TikTok的社交买家渗透率和用户使用时间正在迅速攀升,预计将在2023年分别超过Facobook和Youtub…

全景剖析阿里云容器网络数据链路(一):Flannel

作者:余凯 本系列文章由余凯执笔创作,联合作者:阿里云云原生应用平台 谢石 对本文亦有贡献 前言 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的 IaaS 化到现在的微服务化,客户的颗粒度精细化…

基于单机最高能效270亿参数GPT模型的文本生成与理解

作者:李鹏,王玮,陈嘉乐,黄松芳,黄俊 单位:阿里云智能机器学习平台PAI & 达摩院自然语言基础技术 概述 GPT模型能较好的处理文本生成领域的各种任务,比如文本补全,自由问答&am…

scala 流计算之 aggregate()

函数参数详解 def aggregate[B](z: >B)(seqop: (B, A) > B, combop: (B, B) > B): BB: 函数返回结果的数据类型;z:聚类前的参数的初始化值;seqop:是用于序列运算的运算符,用于计算所述集合中每个元素的总和&a…

JAVA环境安装及配置

目录 一、前言 二、JAVA下载及安装配置 1、下载SDK开发包 2、安装SDK 3、环境变量配置 一、前言 大学毕业前系统学习过JAVA,记得当时还是1.6版本,并且特意研读了我人生中第一本最厚的图书《JAVA学习笔记》。掌握了那时比较流行的框架SSH,…

场景编程集锦 - 趣谈验证码

1. 场景描述 或许是近年来电话推销机器人太泛滥了,常常搞得正常的电话销售“灰头土脸”。有人为了验证对方究竟是人还是机器,竟想出来各种各样的奇葩手段。最近一小伙接到了一个汽车推销电话,但他听声音无法判断对方是不是人工客服人员。尽管…

大数据导论笔记

视频课林子雨老师 大数据导论 网页笔记预习大数据导论 大数据导论复习笔记 一、大数据概述 1.数据的概念、类型和组织形式 数据概念 数据类型 (1)数据基本类型 数据类型包括文本,图片,音频,视频等 数据组织形式 2…

【UE4 第一人称射击游戏】30-简单的任务提示功能

上一篇:UE4 第一人称射击游戏】29-流畅的枪械移动本篇效果:到达指定位置后,右上角会出现新的任务提示信息步骤:打开“ThirdPersonCharacter”,添加一个string类型变量默认值设为“Progress Through The Level”打开“F…

.Net Core实现健康检查

ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。运行状况检查由应用程序作为 HTTP 终结点公开。可以为各种实时监视方案配置运行状况检查终结点: 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态…

MySQL 8.0 多实例安装

规划&#xff1a;主要就是data目录和port 端口以及socket 文件路径的差异管理&#xff1a; 配置文件准备 mkdir -p /data/330{6..8}/data chown -R mysql.mysql /data/* cat > /data/3306/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql datadir/data/3306…

新华三命令行基础

命令使用基础命令行视图用户视图• <h3c>• 只能查看配置&#xff0c;不能修改配置只能进行查看系统视图• [h3c]• 可以查看和修改全局配置接口视图• [H3C-GigabitEthernet0/0]• 可以对接口修改配置视图的切换system-view• 从用户视图进入系统视图interface g0/0• 从…

websocket_flask

1.使用socket协议构建server client文件&#xff0c;服务端构建maskrcnn分割模型&#xff0c;客户端发送图片返回分割结果&#xff1b;使用纯socket通信&#xff0c;通信传输效率较低&#xff0c;接收数据需要1024byte连续接收代码如下#server.py import socket import torchvi…

社区发现系列03-Louvain算法分辨率

1、分辨率局限 louvain算法存在的问题&#xff1a;分辨率局限。就是说当通过优化模块度来发现社区结构时&#xff0c;网络在存在一个固有的分辨率局限&#xff0c;导致一些规模较小但是结构显著的社区淹没在大的社区中&#xff0c;无法被识别到。 造成这个问题的根本原因是模块…

曝光:超算实习生的训练模式很独特

升职无望&#xff0c;随时被裁&#xff1b;内卷压力&#xff0c;无情996现如今的打工人实惨&#xff0c;但无论客观行情如何、经济到底有多难&#xff0c;背靠国家政策支持的高级技术人才&#xff0c;任何时候都吃香。超算、先进计算就是这样的行业&#xff0c;已经被定为未来3…

持续交付-Blue Ocean 应用

Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。Blue Ocean 特性&#xff1a;流水线编辑器&#xff1a;用于创建贯穿始终的持续交付流水线&#xff0c;是一种直观并可视化的流水线编辑器。流水线的可视化&#xff1a;对流水线的可视化表示&#xff0c;提…

vm虚拟机及Linux系统安装教程详解

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Java集合源码学习(2)ArrayList

1 概述 ArrayList是基于数组实现的&#xff0c;是一个动态数组&#xff0c;其容量能自动增长&#xff0c;类似于C语言中的动态申请内存&#xff0c;动态增长内存。 ArrayList不是线程安全的&#xff0c;只能用在单线程环境下&#xff0c;多线程环境下可以考虑用Collections.s…