1.ring提供的接口

对于一个模块而言,其对外提供的接口直接表明了它所提供的功能,也是我们分析一个模块最初的入口。ring是一个环形无锁队列,支持多生产者多消费者操作,所以对于队列的操作构成了模块的主要接口。ring的实现在文件rte_ring.crte_ring.h中。

rte_ring_create() //ring的创建rte_ring_init() //ring的初始化rte_ring_lookup() //ring的查找rte_ring_free() //ring的释放rte_ring_dump() //获取ring的使用信息rte_ring_set_water_mark() //设置ring的水标

以上的几个大的接口提供了ring的开始和结束以及查找。同时对于一个队列来说,还有更多的入队,出队操作。如函数

rte_ring_mp_enqueue_burst()//多生产者批量入队

此处就省略其他很多单(多)生产者,单(多)消费者的操作函数接口了。

2.ring的创建及初始化

rte ring的创建是通过rte_ring_create()函数来实现的,这个函数的原型struct rte_ring * rte_ring_create(const char *name, unsigned count, int socket_id,unsigned flags)

这里需要注意的是socket_idflags,在多个进程同时访问同一个ring时,要改善性能,可以创建多个ring,同时要注意多个进程绑定在同一个socket上。另一个参数flags则是表明创建的ring是否安全支持多生产者多消费者模型。接下来就来看看创建及初始化中的一些细节。

首先找到ring_listring_list是挂接在队列中的,根据ring不跨socket的原则,推断是每个socket都维护有一个这样的队列,具体就不去抠代码了,先主后次。

接下来就是两个准备操作:

  • 获取创建的ring的空间大小,为后面分配空间做准备。
  • 分配一个struct rte_tailq_entry *te;结构,在创建完成ring后,挂接这个队列元素到队列中去。此时不妨先看一下这个结构体的定义。

    struct rte_tailq_entry {TAILQ_ENTRY(rte_tailq_entry) next; /**< Pointer entries for a tailq list */void *data; /**< Pointer to the data referenced by this     tailq entry */
    };

    其中的data指针就指向了创建的ring的地址。

然后就是为新创建的ring分配内存空间咯,使用了rte_memzone_reserve()函数分配,这个函数在内存部分详细说明,但是需要注意:

rte_memzone_reserve()只能用于primary进程中内存分配,也暗含了对于多生产者多消费者使用的ring,其ring的创建要在 primary进程中。

最后就是把分配的ring初始化-rte_ring_init(),并填充te元素,把te挂接在队列中。

3.ring的出入队

ring的出入队操作,我们重点来关注几个接口:

__rte_ring_mp_do_enqueue()
__rte_ring_sp_do_enqueue()
__rte_ring_mc_do_dequeue()
__rte_ring_sc_do_dequeue()

无论使用的哪个上层接口,最终调用的就是这4个函数。在使用多生产者多消费者时,函数中会有rte_pause()的操作,里面使用了__mm_pause()指令,看注释意思是避免忙等待,主要应用在短时的loops。至于具体的头和尾指针的移动,可以参考prog_guide中的ring一节,图文并茂。

4.ring的使用范围以及潜在问题

  • 1.ring的调试信息在non_EAL线程中是不支持获取的。
  • 2.ring支持多生产者入队和多消费者出队,但是都是不可抢占的。不可抢占的意思是:
    • 一个线程在做多生产者入队操作,此时,禁止被另一个做多生产者入队的线程抢占。
    • 一个线程在做多消费者出队操作,此时,禁止被另一个做多消费者出队的县城抢占。

    这意味着如果两个线程在同一个core上操作,那么2th线程则必须等到1th线程调度后才能访问,因此,尽量不要在同一个core上对同一个ring做多生产者同时入队或者出队。更详细的说明,请参考 prog_guide 3.3.4章节。

5.关于水标的使用

在初始化ring的时候,可以设置对应的水标位置,但感觉它并未提供设置接口,用的地方不是很多。比如,当入队已经达到水标位置时,就可以返回对应的错误值,上层调用就可以做些处理。

x.关于无锁队列的链接:

无锁队列顶层设计

无锁队列到底有没有锁

转载于:https://www.cnblogs.com/yhp-smarthome/p/6910756.html

DPDK ring简单说明相关推荐

  1. DPDK ring库:环形缓冲区的解剖

    目录 ring库 FreeBSD *中的Ring实施参考 Linux *中的无锁环形缓冲区 附加功能 名称 用例 环形缓冲区的解剖 单一生产者入队 单一消费者出队 多个生产者入队 模数32位索引 生产 ...

  2. dpdk的无锁环形队列Ring

    1. DPDK Ring简介 dpdk实现了一个无锁环形队列Ring,可用于在dpdk不同的应用程序之间进行通信. Ring支持的效果: 先进先出 最大大小是固定的,指针存储在表中 无锁实现 多消费者 ...

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

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

  4. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  5. 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)

    Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...

  6. Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)

    Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...

  7. 《深入浅出DPDK》读书笔记(五):同步互斥机制

    本文内容为读书笔记,摘自<深入浅出DPDK> 56.原子操作 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为& ...

  8. 利用dpdk rte_ring实现进程间通信

    进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存.关于共享内存的实现方式,双方可以通过mmap方式去映射到相同的内存上进而实现内存共享. DPDK实现的rin ...

  9. 数据平面开发套件:DPDK

    摘要:DPDK,是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,是在数据平面应用中为快速的数据包处理提供一 ...

  10. DPDK — 数据平台优化技术

    目录 文章目录 目录 DPDK 优化技术 DPDK 性能影响因素 硬件结构的影响 OS 版本及其内核的影响 OVS 性能问题 内存管理 CPU 核间无锁通信 设置正确的目标 CPU 类型与模式 优化方 ...

最新文章

  1. poj 3321 Apple Trie
  2. dict过滤 python_关于python:过滤dict以只包含某些键?
  3. 【视频】vue指令之@click及其stop修饰符
  4. fedora7 常用软件安装
  5. Spring4.0学习笔记(3) —— Spring_Bean之间的关系
  6. JavaScript-预解析(变量提升)
  7. 4.RabbitMQ实战 --- 解决Rabbit相关问题:编码与模式,RPC
  8. java 字符串转换int_java IPV4字符串转int或long
  9. mysql数据库分表及实现
  10. 人体运动生物力学之人体步态分析
  11. QQ群排名霸屏:快速上排名方法
  12. 吾生有涯 而知也无涯
  13. CF1144C - Two Shuffled Sequences
  14. excel日期相减去除周末_在Excel中突出显示周末日期
  15. oracle存储过程初学实例
  16. 一只小北极熊(结构体
  17. java trim函数的使用方法_java trim的用法实例详解
  18. 硬核!解密四向穿梭车智能化密集存储技术
  19. Mac系统如何查看更新R版本
  20. 公司职员信息管理系统

热门文章

  1. 随机存取存储器与只读存储器
  2. 【杂谈】扒一扒Reddit,Medium,Quora与知乎等国内外高质量AI社区与内容平台
  3. 如何在网页上下载视频
  4. 分享几个简单的HTML网页特效代码
  5. String实现 intern
  6. 使用计算机有关的活动,有关计算机的活动策划书
  7. 注册电子邮箱你知道哪家好吗?好用的电子邮箱盘点
  8. 计算机硬盘的文件怎么删除文件,如何彻底删除文件?彻底删除硬盘数据的几种方法-电脑教程...
  9. 李开复创办创新工场的发言稿及访谈
  10. 【verilog】按键消抖(FPGA,低电平有效按键,状态机法)