它是一个多生产者,单个或多个消费者组成的循环缓冲区。

单生产者单使用者循环缓冲区可以很容易地制成而没有锁。生产者写入缓冲区,然后原子地增加头指针。使用者读取缓冲区,然后以原子方式递增尾指针。

多个生产者在没有锁定的情况下变得棘手,因为它们需要相互协调,以至于不能覆盖缓冲区的同一部分。不过,这仍然可以通过原子递增头指针来完成。诀窍是,增量必须在写入缓冲区之前而不是之后进行。因此,缓冲区中需要有一个标记,以指示它已准备好被读取。生产者使用原子增量分配缓冲区,在需要时将其写入数据,然后将其标记为可以读取。消费者同时查看头部指针和标记以告知可以读取多少数据。

可以通过简单地为每个消费者维护一个尾指针来实现多个消费者。但是,为了真正实现无锁,生产者不能被缓慢的消费者所阻挡。取而代之的是,生产者只是简单地按照他们想要的速度写作,而消费者则尽其所能跟上。如果使用计数器而不是指针或索引,则消费者可以检测到它何时落在后面。不是围绕增量循环,而是围绕对循环缓冲区的访问。这样,可以判断何时计数器落后于头部计数器后面的缓冲区大小。可以使用64位计数器而不必担心翻转从头开始,也可以为计数器使用较小的数据类型,然后将缓冲区的大小设置为2的幂,以便整数翻转不会导致不连续性。

Linux环形缓冲区原理相关推荐

  1. C语言构建环形缓冲区

    它逻辑上是一个首尾相连的FIFO结构,具体实现上采用简单的线性数组.通过额外的辅助标志(head.tail)能很快知道队列的使用情况(是满还是为空).正因为其简单高效的原因,甚至在硬件都实现了环形队列 ...

  2. C语言实现环形缓冲区

    文章目录 前言 一.什么是环形缓冲区? 二.为什么要使用环形缓冲区及环形缓冲区实用场景 三.环形缓冲区原理及代码的编写 原理 代码编写 总结 前言 本篇文章将为大家介绍一下什么是环形缓冲区,在很多场合 ...

  3. linux接收数据并保存到环形缓冲区,自定义print函数缓存打印数据到环形缓冲区...

    驱动程序: #include "linux/module.h" #include "linux/kernel.h" #include "linux/f ...

  4. Linux下缓冲区溢出攻击的原理及对策

    前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...

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

    消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了.频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行.也许我们可以 ...

  6. 【golang源码分析】chan底层原理——附带读写用户队列的环形缓冲区

    1 环形缓冲区 1.1 环形缓冲区结构 环形缓冲区通常有一个读指针和一个写指针.读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区.通过移动读指针和写指针就可以实现缓冲区的数据读取和 ...

  7. 在dmesg中打印_讲解Linux下的Dmesg命令:格式化及过滤dmesg输出、清除环形缓冲区...

    在本文中,我们将介绍Linux下dmesg命令的基础知识.Linux内核是操作系统的核心,它控制对系统资源(例如CPU.I/O设备.物理内存和文件系统)的访问,在引导过程中以及系统运行时,内核会将各种 ...

  8. Linux dmesg 命令 - 打印内核环形缓冲区

    Dmesg 命令打印内核的消息缓冲区.dmesg 命令主要用于识别故障设备.USB 等热插拔设备.I/O 设备错误. 当系统启动内核设置中存在的设备驱动程序以及相关的硬件设备时.那时驱动程序和其他带有 ...

  9. linux 内核环形缓冲区,环形缓冲区

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 万丈高楼平地起的前提是地基好. 环形缓冲区 介绍 圆形缓冲区(circular buffer),也称作圆形队列(circ ...

最新文章

  1. 输出链表中倒数第k个结点
  2. Python筛选中文字符(跟网上其他可能不一样)
  3. 2017中国电商峰会共话“一带一路”网上商机
  4. Greedy Sequence(2019南京icpc网络预选赛)主席树求区间小于k的最大值
  5. 苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)
  6. 暴力枚举——火柴棒等式(洛谷 P1149)
  7. nginx核心模块ngx_http_core_module详解
  8. Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
  9. Python爬虫系列:使用selenium+Edge查询指定城市天气情况
  10. 洛谷3871 [TJOI2010]中位数 维护队列的中位数
  11. .net framework 4.0安装_R4.0的源码安装——以mac为例
  12. 【Android开发】图形图像处理技术-绘制文本
  13. ipa包上传itunes store失败
  14. 案例剖析:关于优化外贸网店提高支付率
  15. linux iscsi 发起程序,设置iSCSI的发起程序(客户端)(三)
  16. 39张IoT传感器工作原理GIF动图汇总
  17. docker下Gitlab如何进行备份恢复与迁移?
  18. 窥探现代浏览器架构(二)
  19. 游戏平台如何设置公会分成
  20. SBT10100VDC-ASEMI低压降贴片肖特基二极管SBT10100VDC

热门文章

  1. php7 imagick扩展,php7安装imagick扩展
  2. hypermesh安装包百度云_HYPERMESH11.0 64bt软件
  3. Eclipse-无法执行现有代码,依旧执行以前的代码
  4. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程
  5. 2.3_circular_queue_环形队列
  6. 2021年重庆市高考成绩查询时间复核,2021年重庆高考怎么查询是否被录取,具体录取时间安排...
  7. python定时爬虫_python 每天如何定时启动爬虫任务(实现方法分享)
  8. A. Raising Bacteria
  9. win7 安装 memcached
  10. 每隔一段时间自动执行一次某个方法(使用线程)[C#]