Linux环形缓冲区原理
它是一个多生产者,单个或多个消费者组成的循环缓冲区。
单生产者单使用者循环缓冲区可以很容易地制成而没有锁。生产者写入缓冲区,然后原子地增加头指针。使用者读取缓冲区,然后以原子方式递增尾指针。
多个生产者在没有锁定的情况下变得棘手,因为它们需要相互协调,以至于不能覆盖缓冲区的同一部分。不过,这仍然可以通过原子递增头指针来完成。诀窍是,增量必须在写入缓冲区之前而不是之后进行。因此,缓冲区中需要有一个标记,以指示它已准备好被读取。生产者使用原子增量分配缓冲区,在需要时将其写入数据,然后将其标记为可以读取。消费者同时查看头部指针和标记以告知可以读取多少数据。
可以通过简单地为每个消费者维护一个尾指针来实现多个消费者。但是,为了真正实现无锁,生产者不能被缓慢的消费者所阻挡。取而代之的是,生产者只是简单地按照他们想要的速度写作,而消费者则尽其所能跟上。如果使用计数器而不是指针或索引,则消费者可以检测到它何时落在后面。不是围绕增量循环,而是围绕对循环缓冲区的访问。这样,可以判断何时计数器落后于头部计数器后面的缓冲区大小。可以使用64位计数器而不必担心翻转从头开始,也可以为计数器使用较小的数据类型,然后将缓冲区的大小设置为2的幂,以便整数翻转不会导致不连续性。
Linux环形缓冲区原理相关推荐
- C语言构建环形缓冲区
它逻辑上是一个首尾相连的FIFO结构,具体实现上采用简单的线性数组.通过额外的辅助标志(head.tail)能很快知道队列的使用情况(是满还是为空).正因为其简单高效的原因,甚至在硬件都实现了环形队列 ...
- C语言实现环形缓冲区
文章目录 前言 一.什么是环形缓冲区? 二.为什么要使用环形缓冲区及环形缓冲区实用场景 三.环形缓冲区原理及代码的编写 原理 代码编写 总结 前言 本篇文章将为大家介绍一下什么是环形缓冲区,在很多场合 ...
- linux接收数据并保存到环形缓冲区,自定义print函数缓存打印数据到环形缓冲区...
驱动程序: #include "linux/module.h" #include "linux/kernel.h" #include "linux/f ...
- Linux下缓冲区溢出攻击的原理及对策
前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...
- 环形缓冲区的实现原理(ring buffer)
消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了.频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行.也许我们可以 ...
- 【golang源码分析】chan底层原理——附带读写用户队列的环形缓冲区
1 环形缓冲区 1.1 环形缓冲区结构 环形缓冲区通常有一个读指针和一个写指针.读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区.通过移动读指针和写指针就可以实现缓冲区的数据读取和 ...
- 在dmesg中打印_讲解Linux下的Dmesg命令:格式化及过滤dmesg输出、清除环形缓冲区...
在本文中,我们将介绍Linux下dmesg命令的基础知识.Linux内核是操作系统的核心,它控制对系统资源(例如CPU.I/O设备.物理内存和文件系统)的访问,在引导过程中以及系统运行时,内核会将各种 ...
- Linux dmesg 命令 - 打印内核环形缓冲区
Dmesg 命令打印内核的消息缓冲区.dmesg 命令主要用于识别故障设备.USB 等热插拔设备.I/O 设备错误. 当系统启动内核设置中存在的设备驱动程序以及相关的硬件设备时.那时驱动程序和其他带有 ...
- linux 内核环形缓冲区,环形缓冲区
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 万丈高楼平地起的前提是地基好. 环形缓冲区 介绍 圆形缓冲区(circular buffer),也称作圆形队列(circ ...
最新文章
- 输出链表中倒数第k个结点
- Python筛选中文字符(跟网上其他可能不一样)
- 2017中国电商峰会共话“一带一路”网上商机
- Greedy Sequence(2019南京icpc网络预选赛)主席树求区间小于k的最大值
- 苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)
- 暴力枚举——火柴棒等式(洛谷 P1149)
- nginx核心模块ngx_http_core_module详解
- Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
- Python爬虫系列:使用selenium+Edge查询指定城市天气情况
- 洛谷3871 [TJOI2010]中位数 维护队列的中位数
- .net framework 4.0安装_R4.0的源码安装——以mac为例
- 【Android开发】图形图像处理技术-绘制文本
- ipa包上传itunes store失败
- 案例剖析:关于优化外贸网店提高支付率
- linux iscsi 发起程序,设置iSCSI的发起程序(客户端)(三)
- 39张IoT传感器工作原理GIF动图汇总
- docker下Gitlab如何进行备份恢复与迁移?
- 窥探现代浏览器架构(二)
- 游戏平台如何设置公会分成
- SBT10100VDC-ASEMI低压降贴片肖特基二极管SBT10100VDC
热门文章
- php7 imagick扩展,php7安装imagick扩展
- hypermesh安装包百度云_HYPERMESH11.0 64bt软件
- Eclipse-无法执行现有代码,依旧执行以前的代码
- socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程
- 2.3_circular_queue_环形队列
- 2021年重庆市高考成绩查询时间复核,2021年重庆高考怎么查询是否被录取,具体录取时间安排...
- python定时爬虫_python 每天如何定时启动爬虫任务(实现方法分享)
- A. Raising Bacteria
- win7 安装 memcached
- 每隔一段时间自动执行一次某个方法(使用线程)[C#]