环形缓冲区(ring buffer),环形队列(ring queue) 原理

嵌入式C基础——循环队列 ringbuffer 讲解 ringbuffer的原理讲解以及rtos例子,还有实际举例 阅读详情
1. 序言
环形缓冲区(ring buffer),环形队列(ring queue) 多用于2个线程之间传递数据,是标准的先入先出(FIFO)模型。一般来说,对于多线程共享数据,需要使用mutex来同步,这样共享数据才不至于发生不可预测的修改/读取,然而,mutex的使用也带来了额外的系统开销,ring buffer/queue 的引入,就是为了有效地解决这个问题,因其特殊的结构及算法,可以用于2个线程中共享数据的同步,而且必须遵循1个线程push in,另一线程pull out的原则。

线程 A                  媒介                    线程 B
data in --> ring buffer/queue --> data out

2. ring buffer 数据结构
struct _RingB
{
	SI32 r_cursor;
	SI32 w_cursor;
	SI32 tr_cursor;
	SI32 tw_cursor;
	SI32 length;
	char data[0];
};
ring buffer主要用于存储一段连续的数据块,例如网络接收的数据。
r_cursor 读指针,只在线程B中才能被修改,对于线程A,它是readonly的
tr_cursor 辅助读指针,只在线程B中才能被引用,用于计算当前有多少可读数据
w_cursor 写指针,只在线程A中才能被修改,对于线程B,它是readonly的
tw_cursor 辅助写指针,只在线程A中才能被引用,用于计算当前有多少空闲位置可以写入数据
length 缓冲区长度
data 缓冲区实体
需要注意的是,在data中,需要保留1byte的位置,因为:
a. push数据时,理论上来说,我们应该是从 thiz->tw_cursor = (thiz->w_cursor + 1) % thiz->length; 
开始写的,如果此时 thiz->tw_cursor == thiz->r_cursor, 我们认为此时缓冲区已满
b.  pull数据时,也是相同的道理,thiz->r_cursor == thiz->w_cursor,我们认为此时缓冲区无数据可读
也就是说,r_cursor == w_cursor 是一个特殊的位置,所以我们需要在data里面保留1byte。
具体原理可参考 IDirectSoundBuffer8 

函数列表:
RingB*	ringb_create(UI32 size);
void	ringb_destroy(RingB* thiz);
SI32	ringb_write_lock(RingB* thiz, SI8** ptr1, SI32* size1, SI8** ptr2, SI32* size2);
SI32	ringb_write_unlock(RingB* thiz, const SI8* ptr1, SI32 size1, const SI8* ptr2, SI32 size2);
SI32	ringb_write(SI8* ptr1, SI32* size1, SI8* ptr2, SI32* size2, const SI8* src, SI32 len);
SI32	ringb_read_lock(RingB* thiz, SI8** ptr1, SI32* size1, SI8** ptr2, SI32* size2);
SI32	ringb_read_unlock(RingB* thiz, const SI8* ptr1, SI32 size1, const SI8* ptr2, SI32 size2);
SI32	ringb_read(const SI8* ptr1, SI32* size1,const SI8* ptr2, SI32* size2, SI8* dst, SI32 len);

2. ring queue 数据结构
struct _RingQ
{
	SI32 r_cursor;
	SI32 w_cursor;
	SI32 length;
	void* data[0];
};
ring buffer主要用于存储指针,这个指针指向共享数据的entry.
r_cursor 读指针,只在线程B中才能被修改,对于线程A,它是readonly的
w_cursor 写指针,只在线程A中才能被修改,对于线程B,它是readonly的
length 缓冲区长度
data 缓冲区实体
与ring buffer,在data中,同样需要保留1byte的位置,原理与ring buffer相似,只是tw_cursor,tw_cursor
用临时变量代替而已。

函数列表:
RingQ*	ringq_create(SI32 size);
void	ringq_destroy(RingQ* thiz);
SI32	ringq_push(RingQ* thiz, void* data);
SI32	ringq_pop(RingQ* thiz, void** data);
SI32	ringq_fakePop(RingQ* thiz, void** data);
SI32	ringq_tryPush(RingQ* thiz);
SI32	ringq_tryPop(RingQ* thiz);
队列(queue)环形缓冲区(ring buffer),环形队列(ring queue) 什么是环形缓冲区?想要学会环形队列,你是不是得先学习一下队列???(如何在程序中实现队列?) 如何在代码中实现环形缓冲区? 环形缓冲区适用于甚麽样的场合? 环形缓存区: 环形缓冲器(ringr buffer),也称作圆形队列(circular queue),循环缓冲区(cyclic buffer),圆形缓冲区(circula buffer),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。 背景: 当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的 阅读详情

相关推荐

优秀的内存规划方法——环形缓冲区(ring buffer)

目录什么是环形缓冲区使用环形buffer的好处环形buffer的使用场景进程间通信网络IO区分缓冲区是满或者是空保持一个存储单元为空 什么是环形缓冲区 线性缓冲区 初学者一般使用的buffer是线性的,数据依次排列依次读取,就像流水线。 造成的问题就是,处理大量数据时,需要大段内存,并且需要考虑对内存的管理。频繁的内存分配不但增加系统的开销,更使得内存碎片不断增多,非常不利于程序长期运行。 环形缓冲区 使用一段固定长度的内存,在内存用尽后,剩余未存的数据从这段内存的起始位置开始存放。 就像两个人围着一张原型

路人coder 2万+

环形缓冲区(ring buffer)

环形缓冲区(ring buffer),在内存中并不是一个首位相连成“环”的缓冲区,而是逻辑意义上的一个环。实际上环形缓冲区就是一段数组,是一个先进先出的缓冲区。第一次写环形缓冲区,可能会存在某些情况没有考虑到位请各位佬多多指教。

小马爱折腾的博客 3269

【数据结构及算法】环形缓冲区(ring buffer)实现原理及代码实现(C语言)

0x00前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢! 运行环境:Linux version 2.6.35-22-generic (buildd@rothera) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4) ) 0x01环形缓冲区简介 环形缓冲区(ring buffer)也称作循环缓冲区(cyclic buffer)、圆形队列(circular queue)、圆形缓冲区(circular b

C/C++攻城狮 2万+

C语言知识点 - 001:环形缓冲区Ring Buffer详细分析记录

称作,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。如下为的概念示意图。在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有的应用。在的和文件中,内核文件kfifo.h和kfifo.c中也有的代码实现。由于计算机内存是线性地址空间,因此需要特别的算法设计才可以从逻辑上实现。先不要想的具体实现细节,来看一个简单的例子。如下是一个空间大小为。

梦想技术家 3090

环形缓冲区(ring buffer)原理与实现详解

ring buffer称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。如下为环形缓冲区(ring buffer) 的概念示意图。在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有环形缓冲区(ring buffer) 的应用。

2401_86353562的博客 9313

数据结构小白一小时手搓环形缓冲区

环形缓冲区是一种非常高效且常用的数据结构,特别适用于需要处理数据流的场景。它通过循环利用固定大小的内存空间来实现数据的缓存和传输,避免了频繁的内存分配和释放,提高了系统性能和实时性。理解其工作原理和优缺点,可以帮助开发者更好地选择和使用这种数据结构。环形缓冲区,也称为循环缓冲区(Circular Buffer)、环形队列(Ring Buffer)或循环队列(Circular Queue),是一种固定大小的首尾相连的数据结构,可以把它想象成一个时钟表盘或一个首尾相接的圆环。

2301_79702866的博客 2112

【嵌入式基础】环形缓冲区ring buffer

嵌入式基础:环形缓冲区ring buffer

qq_36056498的博客 4567

环形缓冲区(Ring Buffer / Circular Buffer)详解:原理、优势、应用与高性能实现

环形缓冲区详解:原理与应用 环形缓冲区是一种高效的FIFO数据结构,通过固定大小的连续内存和取模寻址实现确定性O(1)时间复杂度的数据传递。其核心优势包括避免动态内存分配、缓存友好、无需数据搬移以及天然支持批量和DMA传输。特别适合单生产者单消费者(SPSC)场景下的无锁并发实现。本文系统分析了环形缓冲区的数据结构、操作逻辑和设计权衡,并探讨了其在嵌入式系统、网络协议栈和高性能计算中的应用实践。通过批量读写处理和DMA优化,环形缓冲区能够显著提升系统性能,是构建低延迟、高吞吐系统的关键组件。

guigenyi的专栏 875

Ring Buffer 原理

因为这些新的节点的确已经写入了数据(Ring Buffer本身的序号已经更新),而且消费者对这些节点的唯一操作是读而不是写,因此访问不用加锁。在上面的例子中,消费者处理完了Ring Buffer里序号8之前(包括8)的所有数据,那么它期待访问的下一个序号是9。现在序号12到了,消费者可以让ConsumerBarrier去拿这些序号节点里的数据了。另一个好处是——你可以用多个消费者(Consumer)去读同一个RingBuffer ,不需要加锁,也不需要用另外的队列来协调不同的线程(消费者)。

xiandang8023的博客 5284

RingBuffer 环形缓冲区----镜像指示位

称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。这个宏定义用于计算向下对齐的地址。size和align。size是要对齐的内存大小,align是所需的对齐大小。这个宏返回一个值,该值是size向下对齐到align边界后的地址。例如,假设我们有一个 32 位的系统,并且我们需要将数据对齐到 64 位的边界。我们可以使用在这个例子中,data数组的大小为 10 个元素,我们需要将其对齐到 8 字节边界。宏返回data。

呵呵哒!的博客 2405

高性能环形缓冲区(Ring Buffer)原理与C++无锁实现详解

在并发编程中,数据缓冲区是协调生产者和消费者速度差异的核心数据结构。其基本原理是通过预分配的连续内存区域,实现高效的数据存取,避免运行时动态内存分配的开销。从技术价值看,优秀的缓冲区设计能极大降低线程间通信延迟,提升系统吞吐量,这是构建高性能系统的关键。常见的应用场景包括高并发后台服务、音视频流处理和网络通信框架。其中,环形缓冲区(Ring Buffer)因其固有的无锁或轻量级锁特性,成为追求极致性能场景的首选。本文聚焦于Ring Buffer的核心机制,深入剖析其通过模运算与掩码技巧实现的环形逻辑,并详细

weixin_33563728的博客 290

像Unix tail一样思考:Ring-Buffer环形缓冲区tail.c示例逐行精读

Ring-Buffer 是一个专为嵌入式系统设计的轻量级环形缓冲区(circular buffer)C语言库。本文以官方示例中最短小精悍的 tail.c 为主线逐行精读,帮你彻底搞懂环形缓冲区(循环缓冲区)的初始化、入队、出队与覆盖写入原理。读完你会恍然大悟:原来用不到30行代码,就能复刻 Unix tail 命令的核心行为,这种"环形"思维在串口通信、数据采集等场景中极其实用。 📌 先看一张

gitblog_00672的博客 619

ZYNQ烧写程序到flash

1.打开SDK创建FBSl项目 点击finish 2.创建BootImage 导入fsbl.elf、.bin、.elf三个文件,Create Image 生成BOOT.bin文件 3.将BOOT文件烧录到FLASH image File选择2中生成的BOOT.bin文件,FSBL File选择fsbl.elf文件,连接好ZYNQ的Jtag,点击Program,即可烧录。 4.烧录程序到FLASH失败 如果是第一次烧录,需更改创建的fsbl工程下的main函数,在如下代码处加入BootModeRegi

qq_40603614的博客 8295

Ring-Buffer环形缓冲区完全指南:专为嵌入式系统打造的高效数据缓冲方案

**环形缓冲区(Ring Buffer)**,也叫循环缓冲区(Circular Buffer),是嵌入式系统开发中最常用的数据缓冲结构。本文要介绍的 Ring-Buffer 项目,是一个专为嵌入式系统设计的轻量级环形缓冲区实现:代码精简、零依赖、性能出色,非常适合串口通信、传感器数据采集、日志暂存等场景。接下来,本文将从原理到实战,带你完整掌握这套高效数据缓冲方案。 ## 环形缓冲区是什么?一文

gitblog_01153的博客 1046

指标异常检测和诊断

贡献度,即用定量衡量的方式来说明:一个指标YYY的异动△Y△Y△Y,具体是由其中哪些成分XiX_iXi​带来了多少异动△Yi△Y_i△Yi​?

qq_43349542的博客 3163

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 132

5分钟快速上手Ring-Buffer:嵌入式环形缓冲区入门教程

> 面向嵌入式新手的硬核干货:零依赖、零动态内存分配,读完即可上手实战。 环形缓冲区(Ring Buffer / Circular Buffer)是嵌入式开发中最基础也最常用的数据结构之一。本文要介绍的 **Ring-Buffer** 项目,是一个专为嵌入式系统设计的轻量级环形缓冲区开源库:纯 C99 编写、代码量极少、不依赖任何动态内存分配,复制两个源文件即可集成进你的工程。这份环形缓冲区入门

gitblog_00305的博客 435

手把手教你用Microsoft AEC Challenge数据集训练自己的回声消除模型(附完整代码)

本文详细介绍了如何使用Microsoft AEC Challenge数据集训练专业的回声消除模型,包括环境准备、数据清洗、模型架构设计、训练流程和实际部署注意事项。通过完整的代码示例和实战指南,帮助开发者快速掌握AEC技术,提升语音通信系统的回声消除效果。

weixin_27697385的博客 454

maxdoop中ring buffer的用法

镜像指示位策略引入了两个布尔变量(指示位),来分别标记读指针或写指针是否进入了镜像区间,[�,2�−1],在读写指针的值相同情况下,如果二者的指示位相同,说明缓冲区。读索引读指针缓冲区长度读索引=读指针&(缓冲区长度−1)写索引写指针缓冲区长度写索引=写指针&(缓冲区长度−1)读索引读指针缓冲区长度读索引=读指针&(缓冲区长度−1)写索引写指针缓冲区长度写索引=写指针&(缓冲区长度−1)读索引读指针缓冲区长度读索引=读指针&(缓冲区长度−1)写索引写指针缓冲区长度写索引=写指针&(缓冲区长度−1)

maxdoop的博客 1117

BIM模型导入SuperMap

目录 一、超图 BIM插件安装 1.1 插件下载 1.2 安装 二、BIM模型导出 2.1 Revit插件导出 2.2 SuperMap导入工具 三、SuperMap BIM数据处理与服务发布 四、SuperMap三维数据处理中关于模型高程修改方法 一、超图 BIM插件安装 1.1 插件下载 下载链接:http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?tt=ProductAAS&id=134 1..

爱晒太阳的风 3595

闲鱼客户端三重动态签名机制解析:x-sign、x-mini-wua与x-umt

在移动客户端安全通信中,设备级动态签名已成为主流App防范自动化攻击的核心手段。其原理是将设备指纹、运行时行为与可信硬件标识深度融合,生成不可复用、不可跨端、不可静态伪造的请求凭证。这类机制超越传统Token或Session鉴权,具备强上下文绑定性与实时熵值校验能力,广泛应用于电商、社交及开放平台等高风险接口场景。技术价值体现在有效识别模拟器、无头浏览器与集群化爬虫,同时保障多端一致性与合规数据对接。本文聚焦闲鱼客户端实际落地的x-sign(带设备上下文的混合签名)、x-mini-wua(小程序行为水印)与

weixin_35732273的博客 495

Ring Buffers (环形消息缓冲区)

Ring Buffers 基本结构 即环形缓冲区:添加环形缓冲区是为了提供一种可以接受任意长度条目的缓冲区形式。 (内存管理)是一种数据结构用于表示一个固定尺寸、头尾相连的缓冲区,适合缓存数据流。内部除维护一个环形缓冲区外,还有两个二值信号量,用于读写保护: 1.发送保护信号量:二值信号量,通知被阻塞发送的任务有更多可用空间或阻塞已经超时。 2.接收保护信号量,二值信号量,通知被阻塞接收的任务指示新的数据/项已写入环形缓冲区或者阻塞超时。 为什么需要Ring Buffers...

物联网老王的博客,公众号同名 6337

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 188
上一篇: [转] 一个fork的面试题
下一篇: 获得本地IP的三种方法
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值