Linux内核源码学习之kfifo

本文详细介绍了Linux内核中的kfifo实现,包括其原理、特点和功能函数。kfifo基于循环队列,提供无锁并发访问,并有动态与静态创建方式,以及推入、摘取数据等多种操作。此外,还涉及内存屏障技术的应用。
摘要由CSDN通过智能技术生成

       队列适合于生产者和消费者的编程模型中。在该模型中,生产者创造数据,消费者则读取并处理数据。Linux内核通用队列由kfifo实现。它实现在文件kernel/kfifo.c中,声明在<linux/kfifo.h>中。这里分析的是内核版本2.6.35.3的kfifo。

一、kfifo原理

       kfifo实现原理是采用循环(环形)队列。关于循环(环形)队列请自行百度或参考数据结构的书籍。

二、kfifo特点

       kfifo的设计颇具技巧性,总结有以下几大特点:

1、采用环形缓冲区来实现,提供一个无边界的字节流服务。采用环形缓冲区的好处为,当一个数据元素被用掉后,其余数据元素不需要移动其存储位置,从而减少拷贝提高效率。

2、保证缓冲区大小为2的次幂,不是的向上取整为2的次幂。

3、使用无符号整数保存输入(in)和输出(out)的位置,在输入输出时不对in和out的值进行模运算,而让其自然溢出,并能够保证in-out的结果为缓冲区中已存放的数据长度。

4、将需要取模的运算用 & 操作代替( a % size = (a & (size − 1)) ), 这需要size保证为2的次幂。

5、使用内存屏障(Memory Barrier)技术,实现单消费者和单生产者对kfifo的无锁并发访问(包括多CPU的情况),多个消费者、生产者的并发访问还是需要加锁的。关于kfifo中内存屏障的使用,请参考https://www.linuxi

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值