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

linux内核数据结构之kfifo

1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。...Linux内核的kfifo正好是一个环形队列,可以用来当作环形缓冲区。生产者与消费者使用缓冲区如下图所示: ?...2、linux 内核kfifo kfifo设计的非常巧妙,代码很精简,对于入队和出对处理的出人意料。...这样的好处不言而喻--对kfifo->size取模运算可以转化为与运算,如:kfifo->in % kfifo->size 可以转化为 kfifo->in & (kfifo->size – 1) kfifo...设计的ring_buffer如下所示: /**@brief 仿照linux kfifo写的ring buffer *@atuher Anker date:2013-12-18 * ring_buffer.h

2.9K10

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

后面有一篇博客还介绍了VxWorks下的环形缓冲区的实现机制点击打开链接,从而可以看出linux下的fifo的灵巧性和高效性。...Linux kernal 鬼斧神工,博大精深,让人叹为观止,拍手叫绝。...一、kfifo概述 本文分析的原代码版本 2.6.32.63 kfifo的头文件 include/linux/kfifo.h kfifo的源文件 kernel/kfifo.c...kfifo->size取模运算可以转化为与运算,如下: kfifo->in % kfifo->size 可以转化为 kfifo->in & (kfifo->size – 1) “取模运算”的效率并没有...Linux内核提供的内存屏障API函数说明如下表。内存屏障可用于多处理器和单处理器系统,如果仅用于多处理器系统,就使用smp_xxx函数,在单处理器系统上,它们什么都不要。

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

    HOK日志组件BqLog为什么这么快之2——创新型的WaitFree并发队列

    前置知识:消息队列 本章针对初学者,主要介绍LinuxkFifo和LMAX Disruptor方案,已经了解的同学可以直接跳到 BqLog Ring Buffer 本文专注于CAS (Compare...Linux kFifo kFifoLinux内核提供的一种循环队列(FIFO)的实现,广泛用于内核模块、驱动开发和设备间的高效通信。...让我们回到之前kFifo的例子,我们尝试改一下kfifo_in函数让它可以支持并发写入。...下面是将kFifo_in修改为支持并发写入的示例代码: unsigned int kfifo_in_concurrent(struct kfifo *fifo, const void *buf, unsigned...让我们看看用fetch_add改写的kfifo_in_concurrent函数 unsigned int kfifo_in_concurrent(struct kfifo *fifo, const void

    17410

    Linux网络编程基础API

    好在Linux内核检测到TCP紧急标志时,将通知应用程序有带外数据需要接收。内核通知应用程序带外数据到达的两种常见方式是: 1O复用产生的异常事件和SIGURG信号。...对这种情况,Linux给开发人员提供的解决方案是:对监听socket设置这些socket选项,那么accept返回的连接socket将自动继承这些选项。...网络信息API 利用域名获取IP地址 IP地址比域名发生变更的概率要高,所以利用IP地址编写程序并非上策。...getnameinfo和getaddrinfo函数成功时返回0,失败时返回错误码,可能的错误码如表: Linux下strerror函数能将数值错误码error转换成易读的字符串形式,同样下面的函数可将表错误码转换成字符串形式

    1.4K20

    Linux API 揭秘】container_of函数详解

    Linux API 揭秘】container_of函数详解 1、container_of函数介绍 container_of可以说是内核中使用最为频繁的一个函数了,简单来说,它的主要作用就是根据我们结构体中的已知的成员变量的地址...image-20231212195328080 下面我们看看linux是如何实现的吧 2、container_of函数实现 /** * container_of - cast a member of...container_of()"); \ ((type *)(__mptr - offsetof(type, member))); }) 函数名称:container_of 文件位置:include/linux..._Static_assert(expr, msg) 函数名称:static_assert 文件位置:include/linux/build_bug.h 函数解析:该宏定义主要用来 在编译时检查常量表达式...在新的linux源码中,直接引用了gcc内置的函数,而在老的内核源码中,该偏移量的实现方式如下: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0

    33010

    API测试--HTTPie入门【Linux-Command line】

    使用HTTPie(一种使用Python编写的易于使用的命令行工具)调试API客户端。...httpbin.org网站是测试Web API客户端以及仔细管理和显示请求和响应中的详细信息的强大方法,但是现在我们将重点介绍HTTPie的功能。...但是,API请求在两台计算机之间进行结构化调用。 人不是图片的一部分,HTTPie这样的命令行工具的参数可以有效地处理此问题。 安装HTTPie 有几种安装HTTPie的方法。...如果没有它,HTTPie将默认打印整个响应,包括标题: 屏幕快照 2019-11-24 下午8.00.36.png 这在调试API服务时至关重要,因为在headers中发送了大量信息。...可以使用快捷方式: 屏幕快照 2019-11-24 下午8.10.42.png 下次调试Web API(无论是你自己的还是其他人的Web API)时,请放下cURL并访问HTTPie(Web API的命令行客户端

    1.1K00

    浅墨: 聊聊原子变量、锁、内存屏障那点事(2)

    IA-32/AMD64架构上,在Linux下常用的GCC编译器上,优化屏障定义为(linux kernel, include/linux/compiler-gcc.h): 优化屏障告知编译器: 1....参考文献5中给出了在Linux下重现出Store-Load乱序的代码,有兴趣的读者可以自行测试。 但是内存一致性模型不仅仅是没有指令重排就会保证一致的。...Linux Kernel里的KFIFO的实现可以拿来参考(include/linux/kfifo.h): 现可以拿来参考(include/linux/kfifo.h): 代码中的smp_wmb()、smp_rmb...但是Linux Kernel的代码要兼容所有的SMP架构,还要考虑很多弱内存模型的架构。所以这里的内存同步操作很多,但是不一定在AMD64上是必要的。...当然,如果要考虑跨平台跨架构的代码,这样做是最保险的(另外Linux Kernel 4.0上KFIFO这个数据结构变化很大,内存同步操作也仅剩下smp_wmb(),这个还没顾得上研究)。

    1.5K40

    Linux系统调用API】一、open与close函数

    一、系统API与C库函数的调用关系 当我们在C语言程序中调用一个库函数的时候,比如调用printf()函数,实际上它是通过文件指针来指向要打印的位置的。...并且,printf()函数会调用Linux的系统函数write()函数(它是一个系统接口,也可以人工调用),write()函数再继续调用sys_write()函数(这个函数只能是操作系统去调用),sys_write...实际上,在Linux下启动一个进程,就会默认打开三个文件描述符:0标准输入、1标准输出、2标准错误。它们分别对应C语言中的stdin、stdout、stderr。...在系统API中,主要包含了这些函数:与文件IO相关的函数接口(比如open(),close(),write(),read()等);与文件属性相关的函数;与目录操作相关的函数;与目录遍历相关的函数;还有dup...man functionname 没有显示出函数原型等信息,这就说明该函数也有对应的同名命令,这时候可以通过加章节来查看函数说明,比如 man 2 functionname 表示查看第二章,也就是系统调用API

    12110
    领券