1. DPDK Ring简介

dpdk实现了一个无锁环形队列Ring,可用于在dpdk不同的应用程序之间进行通信。

Ring支持的效果:

  • 先进先出
  • 最大大小是固定的,指针存储在表中
  • 无锁实现
  • 多消费者或单消费者出队
  • 多生产者或单生产者入队
struct rte_ring {                                                                                                                            /* Ring producer status. */                                                                                struct prod {                                                                                                uint32_t watermark;     /**< Maximum itemsbefore EDQUOT. */                                             uint32_t sp_enqueue;    /**< True, if single producer. */                                                uint32_t size;          /**< Size of ring.*/                                                           uint32_t mask;          /**< Mask (size-1)of ring. */                                                   volatile uint32_thead;  /**< Producer head.*/                                                           volatileuint32_t tail;  /**< Producer tail.*/                                                           } prod __rte_cache_aligned;                                                 /* Ring consumer status. */                                                                                struct cons {                                                                                                uint32_t sc_dequeue;    /**< True, if single consumer. */                                                uint32_t size;          /**< Size of thering. */                                                       uint32_t mask;          /**< Mask (size-1)of ring. */                                                   volatileuint32_t head;  /**< Consumer head.*/                                                           volatileuint32_t tail;  /**< Consumer tail.*/                                                                                                                                      } cons __rte_cache_aligned;                                                                                  void*ring[] __rte_cache_aligned;  };

2. Ring实现

2.1 单一生产者入队

首先,将ring-> prod_head和ring-> cons_tail复制到局部变量中。prod_next局部变量指向表的下一个元素,或在批量入队的情况下指向多个元素。

如果环中没有足够的空间(通过检查cons_tail可以检测到),它将返回错误。

第二步是修改环结构中的ring-> prod_head以指向与prod_next相同的位置。

指向添加对象的指针将复制到环(obj4)中。

将对象添加到环中后,将修改环结构中的ring-> prod_tail使其指向与ring-> prod_head相同的位置。入队操作完成。

2.2 单一消费者出队

首先,将ring-> cons_head和ring-> prod_tail复制到局部变量中。cons_next局部变量指向表的下一个元素,或在批量出队的情况下指向多个元素。

如果环中没有足够的对象(通过检查prod_tail可以检测到),它将返回错误。

第二步是修改ring结构中的ring-> cons_head,使其指向与cons_next相同的位置。

指向出队对象(obj1)的指针被复制到用户指定的指针中。

最后,将ring结构中的ring-> cons_tail修改为指向与ring-> cons_head相同的位置。出队操作完成。

2.3 多个生产者入队

当两个生产者同时将对象添加到环时会发生什么?

在两个CPU core上,ring-> prod_head和ring-> cons_tail都复制到局部变量中。prod_next局部变量指向表的下一个元素,或者在批量入队的情况下指向多个元素。

如果环中没有足够的空间(通过检查cons_tail可以检测到),它将返回错误。

第二步是修改ring结构中的ring-> prod_head以指向与prod_next相同的位置。此操作使用“比较并交换”(CAS)指令完成,该指令自动执行以下操作:

  • 如果ring-> prod_head与局部变量prod_head不同,则CAS操作失败,并且代码在第一步重新启动。
  • 否则,将ring-> prod_head设置为本地prod_next,CAS操作成功,然后继续处理。

在该图中,操作在内核1上成功完成,而第一步在内核2上重新启动。


成功在核心2上重试CAS操作。

核心1更新了ring(obj4)的一个元素,核心2更新了另一个(obj5)的元素。


每个内核现在都想更新ring-> prod_tail。仅当ring-> prod_tail等于prod_head局部变量时,内核才能更新它。这仅在内核1上成立。操作已在内核1上完成。


内核1更新了ring-> prod_tail之后,内核2也可以对其进行更新。该操作也在内核2上完成。

3. 参考

DPDK Ring Library
Linux Lockless Ring Buffer Design

dpdk的无锁环形队列Ring相关推荐

  1. (精简理解)DPDK的无锁环形队列Ring

    这里写目录标题 1. DPDK Ring简介 2. Ring实现 2.1 单一生产者入队 2.2 单一消费者出队 2.3 多个生产者入队 2.4 多个消费者出队 3 总结 3.1 入队列 3.2 出队 ...

  2. 无锁环形队列的几种高效实现

    1.环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照"先进先出"的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是 ...

  3. 理解 Memory barrier(内存屏障)无锁环形队列

    Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的性能.内存乱序访问主要发生在两 ...

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

    由以下博客的分析可以知道,内核的kfifo使用了很多技巧以实现其高效性.比如,通过限定写入的数据不能溢出和内存屏障实现在单线程写单线程读的情况下不使用锁.因为锁是使用在共享资源可能存在冲突的情况下.还 ...

  5. 【共享内存】基于共享内存的无锁消息队列设计

    上交所技术服务 2018-09-05 https://mp.weixin.qq.com/s/RqHsX3NIZ4_BS8O30KWYhQ 目录 一.背景 二.消息队列的应用需求 (一)  通信架构的升 ...

  6. java的“看门狗”锁续期可以用php redis这样实现【php锁续期、分布式锁、无锁请求队列超卖】解决【商家超卖(商品库存控制)、用户超买(秒杀订单控制)】问题。非demo 线上一直在用

    要求与痛点描述 1.不允许使用库存创建队列 因为库存如果是10w难道要创建一个10w长度的队列吗 2.不允许对整个业务过程加锁 可能业务执行时间很长 导致锁粒度太大 影响并发量 3.如果业务时间大于锁 ...

  7. 深入理解高并发技术dpdk无锁队列

    前两周给大家直播分享,并发技术全景(从硬件,操作系统,虚拟机/标准库,编程语言等) 上半场(5个小时):并发/并行技术全景指南 下半场(5个小时):人生的下半场,你准备好了吗 最后我上周还布置了一个作 ...

  8. DPDK无锁队列rte_ring相关代码及示例程序(rte_ring.h,rte_ring.c,main.c,makefile)

    目录 rte_ring.h rte_ring.c main.c makefile 推荐阅读: [共享内存]基于共享内存的无锁消息队列设计:https://rtoax.blog.csdn.net/art ...

  9. 无锁队列原理及实现(二)

    环形队列 Ring Buffer 上一篇降到了环形队列的一些性质.现在来说实现. 从需求开看环形队列需要进行两个操作 写入 读取 而作为一个大小有限内存区域,就会有临界状态来限制置否能写入成功,或者是 ...

最新文章

  1. 字节开启员工期权兑换,126美元每股;
  2. kettle性能及效率提升_开发人员掌握了这个技术,SQL效率会有几百倍的性能提升...
  3. python交作业的格式_python作业4
  4. Linux下搭建SVN+版本冲突
  5. SpringBoot框架与MyBatis集成,连接Mysql数据库
  6. 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*
  7. java的编译代码混淆
  8. 如何制作U盘启动菜单
  9. CmsEasy7.6.3.2逻辑漏洞
  10. 使用HTML制作简易求职表
  11. SmartUpload文件上传
  12. 从零开始学统计 03 | 均值,方差,标准差
  13. 教你删除Mac下的iCloud数据
  14. 【数字电子技术 Digital Electronic Technology 2】—— 逻辑代数基础 之 逻辑函数以其描述方法解析
  15. Android Service 定时任务
  16. CSS布局及实例仿LOL主页
  17. 计算机五笔字型编码方法,《五笔字型输入的编码规则》说课稿
  18. 如何区分MNO和MVNO
  19. 博贤科技管理系统漏洞0day
  20. 女孩如何选择一个好听又适合的英语名字?

热门文章

  1. c语言冒泡排序_图文解析:如何用PLC梯形图实现冒泡排序算法?
  2. HikariDataSource 监控_Prometheus监控告警浅析
  3. 用计算机解决自动驾驶,自动驾驶汽车很美好,但这3个逻辑解决不了,依然是人类驾驶汽车...
  4. mysql 授权 函数查询_第6篇 MySQL 查询中的数学函数
  5. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用
  6. mysql in 查询优化_mysql in 集合查询优化问题。
  7. pytorch使用早停策略
  8. pandas颠倒dataframe与series的顺序
  9. git mysql差异备份_结合Git实现Mysql差异备份,可用于生产环境
  10. jquery检测input变化_jquery 监控input输入框值得变化