首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

35.Linux-分析并制作环形缓冲区

在上章34.Linux-printk分析、使用printk调试驱动里讲述了:  printk()会将打印信息存在内核环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[]...1.环形缓冲区log_buf[]又是存在内核的哪个文件呢?...2.2 cat /proc/kmsg 只会打印出每次新的环形缓冲区的信息 比如,第一次使用cat /proc/kmsg,会打印出内核启动的所有信息 第二次使用cat /proc/kmsg,就不会出现之前打印的信息...,而环形缓冲区的原理又是什么?...7.接下来便来分析环形缓冲区的原理 和上面函数一样, 环形缓冲区需要一个全局数组,还需要两个标志:读标志R、写标志W 我们以一个全局数组my_buff[7]为例,来分析: 7.1环形缓冲区初始时: int

2.4K80

shuffle 中环形缓冲区

shuffle中环形缓冲区使用于map shuffle阶段存放map的缓存数据,当缓冲区的数据达到一定比率(80%)就会将缓冲区的数据刷写到磁盘文件中,在刷盘之前,会对数据分区、排序、合并...,对缓冲区的操作是边写入边读取的过程,二者互不影响,提升写入的速率,读写过程就是一个生产者、消费者模式,生产者向环形缓冲区中写入数据,消费者从环形缓冲区中读取数据并且写入磁盘。...环形缓冲区在物理上是一组连续的空间地址,在逻辑上是首尾相连的环形空间,通过使用下标实现环形,初始read=write=index=0,read下一个读取位置,write下一次写入位置,index 刷盘的结束位置...当写入写入缓冲区的数据达到一定比率,spillReady.signal() 唤醒spill线程, 后台执行spill操作。...缓冲区包含两部分数据:元数据,包含分区信息、key/value位置、value的长度;真实数据,包含真实的kv信息,元数据与真实数据都存放在唤醒缓冲区中,分别占据着不同的下标范围,spill过程会读取元数据信息

49150
您找到你想要的搜索结果了吗?
是的
没有找到

环形缓冲区的实现

从队列到串口缓冲区的实现 串口环形缓冲区收发:在很多入门级教程中,我们知道的串口收发都是:接收一个数据,触发中断,然后把数据发回来。...②初始化结构体相关信息:使得我们的环形缓冲区是头尾相连的,并且里面没有数据,也就是空的队列。...写入环形缓冲区的代码实现: 1/** 2* @brief Write_RingBuff 3* @param u8 data 4* @return FLASE:环形缓冲区已满,写入失败;TRUE...我使用了宏定义来决定是否开启环形缓冲区的方式来收发数据,移植到大家的代码并不会有其他副作用,只需要开启宏定义即可使用了。...1#define USER_RINGBUFF 1 //使用环形缓冲区形式接收数据 2#if USER_RINGBUFF 3/**如果使用环形缓冲形式接收串口数据***/ 4#define

2.7K40

Linux内核编程--文件流与缓冲区

Linux系统下,通过编程对文件进行操作的方式有两种机制:文件描述符和文件流 1.文件描述符和文件流的区别: 文件描述符的类型为int,文件流的类型为FILE*(文件指针)。...Linux内核操作文件会使用高速缓冲区。...比如write操作, 进程把数据写到缓冲区, 然后内核把数据从缓冲区写到磁盘文件。 当进程不断写入数据时,内核可以等缓冲区满了再一次性往磁盘写入,这样可以提高性能。...流程图如下: 缓冲分三种模式: (1)全缓冲,写满标准I/O缓冲区后才进行I/O操作, 例如磁盘文件(非交互式设备)的I/O操作 (2)行缓冲,在输入/输出中遇到换行符时才进行I/O操作,例如在终端进行...,mode为缓冲区类型,size为缓冲区内字节的数量 --mode参数如下: _IOFBF:全缓冲模式 _IOLBF:行缓冲模式 _IONBF:无缓冲模式 若成功则返回0,若出错则为非0 代码样例:

2.8K10

环形缓冲区

BlockingQueue》中介绍到ArrayBlockingQueue,在物理上是一个数组,但在逻辑上来说是个环形结构。这就衍生出来我们今天要介绍的主题,环形缓冲区。...2、基本概述 2.1、什么是环形缓冲区 环形缓冲区(Circular Buffer)是一种数据结构,它允许我们在固定大小的缓冲区中高效地存储和读取数据。...这种缓冲区通常用于处理流式数据,例如网络数据流或文件数据流。 他之所以被称为环形缓冲区,因为它循环存储数据。数据以 FIFO(先进先出)方式从缓冲区读取,这意味着首先读取最旧的数据。...由于数据在缓冲区中是循环存储的,读/写指针只需要不断移动,而不需要频繁地分配和释放内存。这使得环形缓冲区非常适合处理高速数据流,例如网络传输或实时数据处理。...适用于并发场景:环形缓冲区可以支持多个读者和写者同时访问。当多个线程需要同时读取或写入数据时,可以通过互斥锁或其他同步机制来确保数据的正确性和一致性。这使得环形缓冲区非常适合并发处理和多线程编程。

9610

优雅地用宏实现环形缓冲区

循环缓冲区的设置非常简单。首先,需要定义循环缓冲区的大小。这是通过定义宏 myQ_SIZE 来完成的,同时记住缓冲区大小需要是 2 的幂。 然后通过创建一个 myQ 类型的变量来声明循环缓冲区。...图 1 – 定义循环缓冲区 在此示例中,myQ 被定义为静态以限制缓冲区的范围并声明为易失性,因为它们在中断内被修改。定义循环缓冲区只是第一步。...为了分配缓冲区,必须将这些变量传递给 CBUF_INIT 宏,如下图 2 所示。 图 2 – 缓冲区初始化 除了这个初始设置之外,缓冲区相当简单且易于使用。...图 3 – 推入缓冲区 开发人员不仅希望将数据推送到循环缓冲区上,还希望从缓冲区弹出或获取数据。看到这一点的一个简单示例是需要获取字符并通过 UART 传输的串行发送器。...图 4 – 从缓冲区弹出数据 在健壮的应用程序中,还应检查循环缓冲区长度和溢出状态。CBUF 模块确实提供了能够检查这些重要指标的宏。

88710

无锁环形缓冲区的详细解释

后面有一篇博客还介绍了VxWorks下的环形缓冲区的实现机制点击打开链接,从而可以看出linux下的fifo的灵巧性和高效性。...kfifo是一种”First In First Out “数据结构,它采用了前面提到的环形缓冲区来实现,提供一个无边界的字节流服务。...采用环形缓冲区的好处为,当一个数据元素被用掉后,其余数据元素不需要移动其存储位置,从而减少拷贝提高效率。...Linux内核提供的内存屏障API函数说明如下表。内存屏障可用于多处理器和单处理器系统,如果仅用于多处理器系统,就使用smp_xxx函数,在单处理器系统上,它们什么都不要。...五、扩展 kfifo设计精巧,妙不可言,但主要为内核提供服务,内存屏障函数也主要为内核提供服务,并未开放出来,但是我们学习到了这种设计巧妙之处,就可以依葫芦画瓢,写出自己的并发无锁环形缓冲区

74130

音视频环形缓冲区 介绍与实现

一、什么是环形缓冲区 环形缓冲区(也称为循环缓冲区)是固定大小的缓冲区,工作原理就像内存是连续的且可循环的一样。...当到达缓冲区的尾部时,指针又回到缓冲区的起始位置。...二、为什么使用环形缓冲区 环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在一个音视频处理的机制中,环形缓冲区就可以理解为数据码流的通道,每一个通道都对应着一个环形缓冲区,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行...环形缓冲区通常用作固定大小的队列。固定大小的队列对于嵌入式系统的开发非常友好,因为开发人员通常会尝试使用静态数据存储的方法而不是动态分配。...环形缓冲区对于数据写入和读出以不同速率发生的情况也是非常有用的结构:最新数据始终可用。如果读取数据的速度跟不上写入数据的速度,旧的数据将被新写入的数据覆盖。

75030

虎牙一面:内核缓冲区

本质上其实就是内核空间的一块内存区域罢了 从 Buffer Cache(缓冲区缓存)这个名字上能看出来,内核缓冲区(准确的说,应该是内核缓冲区缓存),其实有两个作用,缓冲(Buffer) + 缓存(Cache...这种数据的预取策略其实就是基于局部性原理 因此当我们向内核请求读取数据时,内核会先到内核缓冲区中去寻找,如果命中数据,则不需要进行真正的磁盘 I/O,直接从缓冲区中返回数据就行了;如果缓存未命中,则内核会从磁盘中读取请求的...说起来一大堆,其实很简单,把握缓冲和缓存的定义就行了,如果你是读,我就会拿多一点放在内核缓冲区,这样你下次读的时候大概率就不需要访问磁盘了,直接从内核缓冲区拿就行;如果你是写,我就会等内核缓冲区中的数据堆积得多了再写磁盘...不同的就是,内核缓冲区处理的是内核空间和磁盘之间的数据传递,目的是减少访问磁盘的次数;而用户缓冲区处理的是用户空间和内核空间的数据传递,目的是减少系统调用的次数(感觉这句话总结的不错,给自己点个赞)...,write 是把用户缓冲区复制到内核缓冲区 心之所向,素履以往,我是小牛肉,小伙伴们下篇文章再见

53730

linux系统编程之基础必备(四):C 标准库IO缓冲区内核缓冲区的区别

向I/O缓冲区中的第二个字符,以后用户再调fgetc ,就直接从I/O缓冲区中读取,而不需要进内核 了,当用户把这1K字节都读完之后,再次调用fgetc 时,fgetc 函数会再次进入内核读1K字节...,C标准库的I/O缓冲区也在用户空间,直接 从用户空间读取数据比进内核读数据要快得多。...3.内核缓冲区 (1)终端缓冲    终端设备有输入和输出队列缓冲区,如下图所示 ?          ...,也 可能写到内核I/O缓冲区中,可以使用fsync函数同步至磁盘文件,至于究竟写到了文件中还是内核缓冲区中对于进程来说是没有差别 的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数据从进程...4.stack overflow 无穷递归或者定义的极大数组都可能导致操作系统为程序预留的栈空间耗尽 程序崩溃(段错误)  参考:《linux c 编程一站式学习》

2.4K111

第10期 | ringbuff,通用FIFO环形缓冲区实现库

1. ringbuff 本期给大家带来的开源项目是 ringbuff ,一款通用FIFO环形缓冲区实现的开源库,作者MaJerle,目前收获 79 个 star,遵循 MIT 开源许可协议。...缓冲区有两种形式,一种是数组,一种就是本文所介绍的环形缓冲区ringbuff。...相较于数组,环形缓冲区对整段内存的利用达到最大,并且使用非常方便,如下: ① 写入的时候不用手动维护下标,直接写入即可(由缓冲区的实现维护); ② 读取的时候不用判断从哪里读,直接读取即可(有缓冲区的实现维护...本文设计的一个简单的不定长串口协议如下: 数据类型:比如0x3F表示这是通道1的数据,0x4E表示通道2的数据; 数据长度:表示后面跟着有效数据的长度; 有效数据:有效字节数; 校验数据:省略; 接下来演示如何用环形缓冲区做到不丢包解析...设计思想解读 关于环形缓冲区背后的设计实现,请阅读这篇文章,写的非常棒: STM32进阶之串口环形缓冲区实现

1.1K30

嵌入式音视频环形缓冲区如何设计?

一、什么是环形缓冲区环形缓冲区(也称为循环缓冲区)是固定大小的缓冲区,工作原理就像内存是连续的且可循环的一样。...当到达缓冲区的尾部时,指针又回到缓冲区的起始位置。...二、为什么使用环形缓冲区环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在一个音视频处理的机制中,环形缓冲区就可以理解为数据码流的通道,每一个通道都对应着一个环形缓冲区,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行...环形缓冲区通常用作固定大小的队列。固定大小的队列对于嵌入式系统的开发非常友好,因为开发人员通常会尝试使用静态数据存储的方法而不是动态分配。...环形缓冲区对于数据写入和读出以不同速率发生的情况也是非常有用的结构:最新数据始终可用。如果读取数据的速度跟不上写入数据的速度,旧的数据将被新写入的数据覆盖。

28340

第10期 | ringbuff,通用FIFO环形缓冲区实现库

1. ringbuff 本期给大家带来的开源项目是 ringbuff ,一款通用FIFO环形缓冲区实现的开源库,作者MaJerle,目前收获 79 个 star,遵循 MIT 开源许可协议。...缓冲区有两种形式,一种是数组,一种就是本文所介绍的环形缓冲区ringbuff。...相较于数组,环形缓冲区对整段内存的利用达到最大,并且使用非常方便,如下: ① 写入的时候不用手动维护下标,直接写入即可(由缓冲区的实现维护); ② 读取的时候不用判断从哪里读,直接读取即可(有缓冲区的实现维护...数据类型:比如0x3F表示这是通道1的数据,0x4E表示通道2的数据; 数据长度:表示后面跟着有效数据的长度; 有效数据:有效字节数; 校验数据:省略; 接下来演示如何用环形缓冲区做到不丢包解析。...设计思想解读 关于环形缓冲区背后的设计实现,请阅读这篇文章,写的非常棒: STM32进阶之串口环形缓冲区实现

1.5K11

input子系统事件处理层(evdev)的环形缓冲区【转】

在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循环队列(circular queue),用以缓存内核驱动上报给用户层的...,input子系统的环形缓冲区采用了“求与”算法,这要求bufsize必须为2的幂,在后文中可以看到bufsize的值实际上是为64或者8的n倍,符合“求与”运算的要求。.../消费者模型,内核驱动产生input_event事件,然后通过input_event()函数写入环形缓冲区,用户程序通过read()函数从环形缓冲区中获取input_event事件。...环形缓冲区的生产者 内核驱动作为生产者,通过input_event()上报input_event事件时,最终调用___pass_event()函数将事件写入环形缓冲区: static void __pass_event...用户程序作为消费者,通过read()函数读取input设备节点时,最终在内核调用evdev_fetch_next_event()函数从环形缓冲区中读取input_event事件: static int

1.3K60

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用

23.2K32

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;

21.2K30

Linux】理解缓冲区

缓冲区的本质就是一段内存。...3.在哪里 缓冲区的位置究竟在哪里:从上面的例子我们直接往显示器上打印结果为4条,往文件打印为7条,这跟缓冲区有关,同时这也说明了缓冲区一定不在内核中,为什么?...如果在内核中write也应该打印两次,write是系统接口。我们之前谈论的所有缓冲区都指的是用户级语言层面提供的缓冲区。...这个缓冲区,在stdout,stdin,stderr对应的类型---->FILE*,FILE是一个结构体,里面封装了fd,同时还包括了一个缓冲区!...FILE结构体缓冲区,所以我们直接要强制刷新的时候fflush(文件指针),关闭文件fclose(文件指针),这是因为传进去的文件指针对应的缓冲区 从源码出发,我们可以来看一看FILE结构体: 所以我们一般所说的缓冲区是语言级别的缓冲区

18040
领券