(转载)环形缓冲区的实现原理(ring buffer)

2023-05-16

环形缓冲区的实现原理(ring buffer)
 
 

在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。

1、环形缓冲区的实现原理

环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性。如果有多个读写用户访问环形缓冲区,那么必须添加互斥保护机制来确保多个用户互斥访问环形缓冲区。

1、图2和图3是一个环形缓冲区的运行示意图。图1是环形缓冲区的初始状态,可以看到读指针和写指针都指向第一个缓冲区处;图2是向环形缓冲区中添加了一个数据后的情况,可以看到写指针已经移动到数据块2的位置,而读指针没有移动;图3是环形缓冲区进行了读取和添加后的状态,可以看到环形缓冲区中已经添加了两个数据,已经读取了一个数据。

 

2、实例:环形缓冲区的实现

环形缓冲区是数据通信程序中使用最为广泛的数据结构之一,下面的代码,实现了一个环形缓冲区:

/*ringbuf .c*/

include<stdio. h>

    include<ctype. h>

#define NMAX 8

int iput = 0; /* 环形缓冲区的当前放入位置 */

int iget = 0; /* 缓冲区的当前取出位置 */

int n = 0; /* 环形缓冲区中的元素总数量 */

double buffer[NMAX];

/* 环形缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将绕回到头部。

环形缓冲区的有效地址编号为:0(NMAX-1)

*/

int addring (int i)

{

        return (i+1) == NMAX ? 0 : i+1;

}

/* 从环形缓冲区中取一个元素 */

double getvoid

{

int pos;

if (n>0){

                      Pos = iget;

                      iget = addring(iget);

                      n--;

                      return buffer[pos];

}

else {

printf(“Buffer is empty/n”);

return 0.0;

}

 

/* 向环形缓冲区中放入一个元素*/

void put(double z)

{

if (n<NMAX){

                      buffer[iput]=z;

                      iput = addring(iput);

                      n++;

}

else

printf(“Buffer is full/n”);

}

 

int main{void)

{

chat opera[5];

double z;

do {

printf(“Please input p|g|e?”);

scanf(“%s”, &opera);

               switch(tolower(opera[0])){

               case ‘p’: /* put */

                  printf(“Please input a float number?”);

                  scanf(“%lf”, &z);

                  put(z);

                  break;

case ‘g’: /* get */

                  z = get();

printf(“%8.2f from Buffer/n”, z);

break;

case ‘e’:

                  printf(“End/n”);

                  break;

default:

                  printf(“%s - Operation command error! /n”, opera);

}/* end switch */

}while(opera[0] != ’e’);

return 0;

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(转载)环形缓冲区的实现原理(ring buffer) 的相关文章

  • softmock-基于mitmproxy实现系统性管理maplocal

    softmock 介绍 softmock 是一个拦截 http https 到本地的工具 请求拦截到本地之后 xff0c 可以进行修改 新增等操作 xff0c 使下次请求直接返回到本地的数据 而不依赖远程服务器 softmock 是从 抓包
  • django设置samesite

    较新版本的chrome会因samesite策略而禁止跨域的cookie 解决方法在项目中的setting py设置 xff1a SESSION COOKIE SAMESITE span class token operator 61 spa
  • 使用python构造一个微信聊天机器人

    申请一个图灵的APIKEY http www tuling123 com python3环境下安装wxpy pip install wxpy linux下还需安装pillow pip install pillow 然后执行以下代码 xff1
  • aiohttp 简易使用教程

    0 前言 本文翻译自aiohttp的官方文档 xff0c 如有纰漏 xff0c 欢迎指出 aiohttp分为服务器端和客户端 xff0c 本文只介绍客户端 由于上下文的缘故 xff0c 请求代码必须在一个异步的函数中进行 xff1a asy
  • Zabbix 5.4 Server安装

    系统 xff1a ubuntu 1804 xff08 1804 server zabbix 5 4 mysql 5 7 x1f4d3 UTF 8是Zabbix支持的唯一编码 它可以正常工作而没有任何安全漏洞 用户应注意 xff0c 如果使用
  • vue基本格式

    MVVM模式 vue的基本步骤 数据绑定 v model name 数据渲染 xff0c 双向绑定
  • Activity中使用onNewIntent方法避免多次实例化同一个Activity

    最近写的项目中有一个搜索 搜索结果 搜索这样一个循环的过程 xff0c 发现了几个问题 xff1a 1 循环导致多次实例化这两个类 xff1b 解决方案 xff1a 在Manifest里面对应activity下面设置启动模式为singleT
  • Linux 无密码自动登录

    GNOME环境 etc gdm3 custom conf文件 xff0c 修改其中的AutomaticLoginEnable xff0c AutomaticLogin项 xff0c 具体如下所示 xff1a Configure Automa
  • FileItem类

    文件上传时需要用到FileItem类 xff0c FileItem是一个接口 xff0c 它的实现类是DiskFileItem 如图为FileItem 接口中定义的方法 xff1a 1 getInputStream xff1a 以流的形式返
  • mysql数据表中文乱码解决办法

    在往 mysql 数据库中插入数据的时候出现数据 汉字 乱码情况 xff1a 在把数据库 xff0c 数据表的编码改为UTF 8后 xff0c 还是乱码 Mysql 的默认编码方式是 Latin1 xff0c 不支持中文 xff0c 因此
  • Spring xml配置文件头解析

    Spring文档中默认的XML文件格式 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt beans xmlns 61 34 http www springfra
  • SpringMVC请求静态资源异常

    问题描述 xff1a 使用 REST 风格的资源URL时 xff0c SpringMVC请求静态资源 图片 js等 发生异常 优雅的 REST 风格的资源URL 不希望带 html 或 do 等后缀 若将 DispatcherServlet
  • web项目异常A web application registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister

    异常 xff1a A web application registered the JBDC driver com mysql jdbc Driver but failed to unregister it when the web app
  • @Controller和@RestController的区别?

    64 Controller和 64 RestController的区别 xff1f 官方文档 xff1a 64 RestController is a stereotype annotation that combines 64 Respo
  • get方式传值中文乱码

    如下情况 xff1a lt a id 61 span class hljs string 34 bookname 34 span title 61 span class hljs string 34 span class hljs vari
  • Zabbix 5.4 server安装后的相关操作

    通过前面的安装 xff0c 相信大家已经能够正常登录zabbix server的管理页面了 在进行正式的使用之前 xff0c 建议大家最好把下面这个管理页面中左侧的操作树中的每一项功能都打开看看 xff0c 这样心中对zabbix serv
  • Maven搭建的SSM项目中遇到的问题

    Maven搭建的SSM项目中遇到的问题 1 EL表达式失效 2 装配异常Unable to configure ssm 解决办法 其实这两个问题的出现都是因为servlet版本和java版本不合适造成的 xff0c EL表达式在servle
  • Java小工具Lombok的安装与使用

    1 Lombok简介 Lombok是一个代码生成器 xff0c 可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具 xff0c 通过使用对应的注解 xff0c 可以在编译源码的时候生成对应的方法 使用 lom
  • 日常记录(1)

    数据库连接池Druid Alibaba github地址 xff1a https github com alibaba druidBlog xff1a http blog csdn net pk490525 article details
  • vnc 设置自定义分辨率

    1 vnc设置分辨率 vncserver geometry 1600x900即可 xff0c 之后通过window下vnc连接后的ubuntu分辨率即为1600x900了 注意这里的X是小写的x而不是 2 但是 xff0c 登录后 xff0

随机推荐

  • 解决Vcenter Client启动Fault Tolerance辅助虚拟机被禁用保护的问题

    解决FT辅助虚拟机被禁用的问题 项目场景 xff1a 学习虚拟机中问题描述 xff1a 辅助虚拟机被禁用原因分析 xff1a 解决方案与结论 项目场景 xff1a 学习虚拟机中 最近这个学期在学习虚拟化技术 xff0c 由于课程是新开的 x
  • kali的重复登录与vnc灰屏

    云安全 xff08 二 xff09 VNC连接的一些小问题 文章目录 云安全 xff08 二 xff09 VNC连接的一些小问题 前言 xff1a 问题重现一 解决灰屏问题二 普通用户循环登录1 原因2 解决方法 三 原因分析四 总结五 项
  • sql注入闯关笔记【Less-1】基于错误的GET单引号字符型注入

    云安全之sql注入 xff08 sqli labs Less 1 文章目录 云安全之sql注入 xff08 sqli labs Less 1 前言一 闯关一 测试注入点二 手工注入三 sqlmap注入 二 总结三 思路与解惑 前言 这学期学
  • 写一个简单的爬虫,可直接复制学习!!

    简单爬虫直面代码 xff0c 可直接复制学习 这个代码的作用主要是用来获取到百度首页的数据 xff0c 只用来供理解学习 真 小白 福利 todo 首先导包requests 用于爬取数据 import requests todo 定义你要爬
  • 教你如何开发VR游戏系列教程五:UI 交互

    原文链接 xff1a 欢迎关注AR学院 上一篇介绍了ugui NGUI 以及普通3D模型的UI设计 这一讲主要介绍怎么样利用这些UI做交互 大家在VR游戏看到的UI以及UI交互 xff0c 主要有哪几种 xff1f 1 头控悬停 xff08
  • C/C++斐波那契数全解(哪种方法更好?)

    目录 一 递归思想 二 空间换时间 三 动态规划 四 通项公式 五 矩阵快速幂 六 总结 本文章参考leetcode斐波那契数官方题解 斐波那契的边界条件是 F 0 61 0 和 F 1 61 1 当 n gt 1 时 xff0c 每一项的
  • Zabbix 5.4客户端安装

    通过前面的操作 xff0c 相信大家的zabbix server已经能够正常的运行起来了 xff0c 但是仅有zabbix server是不完整的 xff0c server的目标是监控其他的主机 xff0c 而并非只监控自身 xff0c 所
  • Linux中kill -2、kill -9等区别 && kill signal汇总

    xfeff xfeff kill号令用于终止指定的过程 xff08 terminate a process xff09 xff0c 是Unix Linux下过程经管的常用号令 凡是 xff0c 我们在须要终止某个或某些过程时 xff0c 先
  • Linux下查找文件(find、grep命令)

    目录 一 find命令 1 按文件名 2 按文件类型查询 3 按照文件大小查找 4 按照文件日期查找 4 1按照创建日期查找 4 2按照修改日期查找 4 3按照访问日期查找 5 按深度查找 5 1查找起始点以下n层的目录 xff0c 不超过
  • 深度剖析数据在内存中的存储

    小编认为要想成为一个好的程序员 xff0c 不能仅仅只做到会使用 xff0c 而要做到理解其本质 做到可持续发展 接下来小编会向大家介绍数据在内存中究竟是如何存储与运算的 xff0c 也算是修炼内功了吧 目录 一 数据类型介绍 1 整型家族
  • Linux下进程控制详解

    目录 一 进程创建 1 1 初识fork 1 2 函数返回值 1 3 写时拷贝技术 1 4 fork函数的使用场景 1 5 fork函数的失败原因 二 进程终止 2 1 进程退出场景 2 2 进程退出码 2 3 进程正常退出方法 2 3 1
  • 基础IO详解

    目录 一 系统文件IO 1 1 open 1 1 1 open的第一个参数 1 1 2 open的第二个参数 1 1 3 open的第三个参数 1 1 4 open的返回值 1 2 close 1 3 write 1 4 read 二 文件
  • HTTPS协议

    一 HTTPS介绍 HTTPS是 个应用层协议 xff0c 是在HTTP协议的基础上引入了加密层 HTTP协议内容都是按照文本的方式明文传输 xff0c 这就导致在传输过程中可能出现被篡改的情况 二 加密 2 1 加密概念 加密就是把明文
  • 传输层 — UDP协议

    目录 一 传输层 1 1 端口号 1 2 关于端口的常见问题 1 3 netstat amp amp pidof 二 UDP协议 2 1 UDP协议格式 2 2 UDP协议特点 2 3 UDP缓冲区 2 4 基于UDP的应用层协议 一 传输
  • 传输层——TCP协议

    目录 一 初步认识 二 TCP协议格式 2 1 初识协议格式 2 2 序号与确认序号 2 3 16位窗口大小 2 4 六个标志位 三 确认应答机制 四 超时重传机制 五 连接管理机制 5 1 三次挥手 5 2 四次挥手 六 流量控制 七 滑
  • Android 8.1 App开机自启动、注册为无障碍服务、实现悬浮窗

    xff08 欢迎转载 xff0c 只需注明本文来源 xff1a https blog csdn net actionwind article details 103619688 xff09 以下各方法大多来自于网上诸多朋友的无私分享 xff
  • 安卓的ATV系统

    Android系统根据是否需要认证分为AOSP系统和ATV系统 AOSP Android开源系统 xff0c 全称为Android Open Source Project ATV 产品依照 Android TV 制式标准提供统一的操作体验
  • ubuntu18 为什么安装的时候选择自动登陆,但是还是不能自动登陆呢

    2019 03 12 16 16 1 点击右上角的向下三角形 2 在出现的对话框里面 xff0c 点击右下角的扳手图标 3 点击 隐私 gt 锁屏 4 自动锁屏 L xff0c 保持不变 5 黑屏至锁屏的等的时间 A 改为 30分钟 6 显
  • zabbix 5.4 添加监控主机

    现在我们已经有了一个客户端主机了 xff0c 接下来我们要在zabbix server管理页面添加这台主机 xff0c 让server对agent进行监控 登录zabbix server的管理页面 xff0c 点击左侧操作树的配置选项 xf
  • (转载)环形缓冲区的实现原理(ring buffer)

    环形缓冲区的实现原理 xff08 ring buffer xff09 在通信程序中 xff0c 经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据 环形缓冲区是一个先进先出的循环缓冲区 xff0c 可以向通信程序提供对缓冲区的互斥访