环形缓冲区的应用ringbuffer】的更多相关文章

在嵌入式开发中离不开设备通信,而在通信中稳定性最高的莫过于环形缓冲区算法, 当读取速度大于写入速度时,在环形缓冲区的支持下不会丢掉任何一个字节(硬件问题除外). 在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据.环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问. 1.环形缓冲区的实现原理 环形缓冲区通常有一个读指针和一个写指针.读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区.通过移动读指针和写指针就可以实现缓冲区的数据读取和…
物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持IoT数十万的高并发连接,并且兼容ModSecurity部分规则. 代码非常优秀,非常值得收藏和学习,今天笔者就从结合himqtt的源码来进行ringbuffer数据结构分析,主要特点是速度快. 一. ringBuffer 介绍 ringBuf…
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系统 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现 嵌入式框架Zorb Framework搭建三:列表的实现 嵌入式框架Zorb Framework搭建四:状态机的实现 嵌入式框架Zorb Framework搭建五:事件的实现 嵌入式框架Zorb Framework搭建六:定时器的实…
还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取数据,数据为空时读进程会等待写进程写入数据. 在上次代码上改的,所以名字还是ioctldemo ioctldemo.c #include <linux/module.h> #include <linux/init.h> #include <linux/stat.h> #in…
在上章34.Linux-printk分析.使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1.环形缓冲区log_buf[]又是存在内核的哪个文件呢? 位于/proc/kmsg里,所以除了dmesg命令查看,也可以使用cat /proc/kmsg来查看 2.但是,dmesg命令和cat /proc/kmsg有所不同 2.1 dmesg命令 每次使用,都会打印出环形缓冲区的所有信息 2.2 c…
在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue),用以缓存内核驱动上报给用户层的input_event事件. struct evdev_client { unsigned int head; // 头指针 unsigned int tail; // 尾指针 unsigned int packet_head; // 包指针 spinlock_t bu…
转自:https://blog.csdn.net/vertor11/article/details/53741681 struct kfifo{ uint8_t *buffer; uint32_t in; // 输入指针 uint32_t out; // 输出指针 uint32_t size; // 缓冲区大小,必须为2的次幂 } /*判断n是否为2的幂*/ static bool is_power_of_2(unsigned int n) { && ((n & (n - )) =…
转自:https://blog.csdn.net/yusiguyuan/article/details/18368095 1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协议栈接收数据(reading data from socket),一边解析接收的数据.具体场景例如:用户点击Youtube或优酷网站上的视频内容,这时用户PC上的播放软件就是一边接收数据一边对数据进行解码并播放的.这样的场景的存在如下约束: 1. 必须边接收数据,边对数据进行解析,不能等待到数据全部…
转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言:     在嵌入式开发中,只要是带操作系统的,在其上开发产品应用,基本都需要用到多线程.     为了提高效率,尽可能的提高并发率.因此,线程之间的通信就是问题的核心.     根据当前产品需要,使用 环形缓冲区 解决. 一,环形缓冲区的实现     1,cbuf.h 点击(此处)折叠或打开 #ifndef __CBUF_H__ #defin…
转载自微信公众号“玩转单片机”,感谢原作者“杰杰”. 队列的概念 在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队). 队列的特点 类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票 队列的常见两种形式 在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们…
环形缓冲区的用途及原理可以去百度资料狠多的,这里就不介绍了.直接贴代码.代码分别用D7,XE2编译测试 源码下载 http://files.cnblogs.com/lwm8246/uCircleBuffer.rar //环形缓冲区实现类 //-- : //QQ unit uCircleBuffer; interface uses Windows,Classes; type TCircleBuffer=class private FMS:TMemoryStream; FUserData:Point…
公司项目中经常设计到串口通信,TCP通信,而且大多都是实时的大数据的传输,然后大家都知道协议通讯肯定涉及到什么,封包.拆包.粘包.校验--什么鬼的概念一大堆,说简单点儿就是要一个高效率可复用的缓存区.按照码农的惯性思维就是去百度.谷歌搜索看有没有现成的东西可以直接拿来用,然而我并没有找到,好吧不是很难的东西自己实现一个呗.开扯-- 为什么要用环形队列? 环形队列是在实际编程极为有用的数据结构,它有如下特点: 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单.能很快知道队列是…
转载:http://blog.csdn.net/HADOOP_83425744/article/details/49560583 http://bigdatadecode.club/MapReduce%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90--%E7%8E%AF%E5%BD%A2%E7%BC%93%E5%86%B2%E5%8C%BA.html 一.什么是Hadoop 环形缓冲区: Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解Map…
#cat aa.c /*ringbuf .c*/ #include<stdio.h> #include<ctype.h> #define NMAX 8 int iput = 0; /* 环形缓冲区的当前放入位置 */ int iget = 0; /* 缓冲区的当前取出位置 */ int n = 0; /* 环形缓冲区中的元素总数量 */ double buffer[NMAX]; /* 环形缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将绕回到头部. 环形缓冲区的有效地址编号为…
dmesg命令被用于检查和控制内核的环形缓冲区.kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息保存在/var/log/dmesg文件里. 语法 dmesg(选项) 选项 -c:显示信息后,清除ring buffer中的内容: -s<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小: -n:设置记录信息的层级.…
队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队). 队列的特点 类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票 队列的常见两种形式 普通队列 在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们一个个的信息. 当有大量数据的时候,我们不…
mapreduce过程解析 数据在map中怎么写入磁盘? 数据:经过map逻辑处理过后的数据(key,value)- 磁盘:本地磁盘 环形缓冲区 1.为什么要环形缓冲区? 答:使用环形缓冲区,便于写入缓冲区和写出缓冲区同时进行. 2.为什么不等缓冲区满了再spill? 答:会出现阻塞. 3.数据的分区和排序是在哪完成的? 答:分区是根据元数据meta中的分区号partition来分区的,排序是在spill的时候排序. 环形缓冲区详解 不同方向写入数据 图示:…
参考文章:http://blog.csdn.net/linyt/article/details/53355355 本文参考linux系统中 kfifo缓冲区实现.由于没有涉及到锁,在多线程环境下,只适用于 单生产者 + 单消费者 模型. fifo_buffer.h #ifndef FIFO_BUFFER_H_ #define FIFO_BUFFER_H_ #include <stdint.h> class FifoBuffer { public: enum { enmDefaultBuffer…
转自:https://blog.csdn.net/eydwyz/article/details/56671023 循环缓冲区在一些竞争问题上提供了一种免锁的机制,免锁的前提是,生产者和消费 都只有一个的情况下,否则也要加锁.下面就内核中提取出来,而经过修改后的fifo进 行简要的分析.  先看其只要数据结构: struct my_fifo { unsignedchar *buffer;/* the buffer holding the data*/ unsignedint size;/* the…
本文转自EasyDarwin团队kim的博客:http://blog.csdn.net/jinlong0603 EasyRTMP的推送缓冲区设计 EasyRTMP内部也同样采用的环形缓冲的设计方法,将音视频数据都同时存入缓冲区,再由发送者从缓冲区中获取数据进行发送,这样就形成了一个异步.生产者.消费者的过程,上层调用者只需要将采集.编码后的音视频Frame数据Push到SDK的缓冲区中,即可返回继续进行上层逻辑操作,SDK内部的发送线程则从缓冲区中不断获取音视频数据推送到流媒体服务器: Easy…
#include <stdio.h> #include <string.h> #include <malloc.h> struct CircleBuf { char *pFirst;//指向循环表开始的位置 char *pLast;//指向循环表结尾的位置 char *plSave;//指向最后一个存数据的后一位,没有数据为NULL,或与pfsave相等 char *pfSave;//指向第一个存数据的位置,没有数据为NULL,或与plsave相等 int iSize;…
看到一篇写的非常详细的帖子,为防止楼主删帖后找不到,果断转载过来 RingBuffer源代码分析 出处:http://bbs.ickey.cn/community/forum.php?mod=viewthread&tid=43202(出处: ICKEY BBS) 大家都知道,环形缓冲区是比较常用的数据结构,正好机智云“微信宠物屋源代码v2.3”中也用到了. 下面给大家分析一下. 首先是数据结构: “RingBuffer.h” 注意是head指向了读区域,tail指向了写区域! 注意是head指向…
系列译文: http://ifeve.com/disruptor/ 当有多个消费者时,(按Disruptor的设计)每个消费者各自控制自己的指针,依次读取每个Slot(也就是每个消费者都会读取到所有的产品),这时只需要保证生产者指针不会超过最慢的消费者(超过最后一个消费者“一圈”)即可,也不需要锁. 重复消费http://blog.csdn.net/zero__007/article/details/49684363 Disruptor多个消费者不重复处理生产者发送的消息的demo Disrup…
先贴个头文件的设计: 首先缓冲区中没有任何数据时,nIdWrite.nIdRead读写下标都为0. 为了判断缓冲区中是否还有数据可读或者可写,我判断的依据是:1)当nIdWrite 等于 nIdRead时,表示缓冲区内没有任何数据可读:否则存在可读的数据2)当剩余的空间小于我们所需要的空间时,表示缓冲区不能再继续写数据,否则可以进行写数据3)这里说明一下,当剩余空间 等于 我们所需要的空间时,实际上也可以进行写数据的, 只不过需要用一个标记来标记缓冲区是否有数据.否则,这个时候nIdWrite…
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS等: <disruptor笔记>系列链接 快速入门 Disruptor类分析 环形队列的基础操作(不用Disruptor类) 事件消费知识点小结 事件消费实战 常见场景 等待策略 知识点补充(终篇) 本篇概览 本文是<disruptor笔记>系列的第三篇,主要任务是编码实现消息生产和消…
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: 1 public class MyQueue<T> : IDisposable 2 { 3 private T[] queue; 4 private int length; 5 private int capacity; 6 private int head = 0; 7 private int tail = 0; 8 9 public MyQue…
使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据.要注意从缓冲区这时是一个环形缓冲区,声音的播放和数据的写入都是从缓冲区中循环进行的. 波形音频数据写入到从缓冲区时需要三个因素:①写入的实践,也就是什么时候开始写入: ②写入位置,也就是要从从缓冲区的哪一个点开始写入: ③写入数据量,也就是从缓冲区有多少缓冲数据已经播放完,可以用新数据填充. 写入时机可以由用户自己预先在从缓冲区中固定位置…
原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的性能.内存乱序访问主要发生在两个阶段: 编译时,编译器优化导致内存乱序访问(指令重排) 运行时,多 CPU 间交互引起内存乱序访问 Memory barrier 能够让 CPU 或编译器在内存访问上有序.一个 Mem…
补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于...先不说别的了,,无论是学51的还是32的,,,先问一下大家用串口发送数据的时候是怎么发的???如果发整型的数据是怎么发的??如果发浮点型的是怎么发的????再问大家串口接收数据是怎么接收的????亲们有没有想过自已用的方法是不是最好最好的方法了,反正我认为我自己现在用的方法应该是很好的了,,不说最好…
转载链接:http://blog.csdn.net/yusiguyuan/article/details/41985907 1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由Linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送.为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数…