DPDK ring简单说明
1.ring提供的接口
对于一个模块而言,其对外提供的接口直接表明了它所提供的功能,也是我们分析一个模块最初的入口。ring是一个环形无锁队列,支持多生产者多消费者操作,所以对于队列的操作构成了模块的主要接口。ring的实现在文件rte_ring.c
和rte_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_id
和flags
,在多个进程同时访问同一个ring时,要改善性能,可以创建多个ring,同时要注意多个进程绑定在同一个socket上。另一个参数flags则是表明创建的ring是否安全支持多生产者多消费者模型。接下来就来看看创建及初始化中的一些细节。
首先找到ring_list
,ring_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简单说明相关推荐
- DPDK ring库:环形缓冲区的解剖
目录 ring库 FreeBSD *中的Ring实施参考 Linux *中的无锁环形缓冲区 附加功能 名称 用例 环形缓冲区的解剖 单一生产者入队 单一消费者出队 多个生产者入队 模数32位索引 生产 ...
- dpdk的无锁环形队列Ring
1. DPDK Ring简介 dpdk实现了一个无锁环形队列Ring,可用于在dpdk不同的应用程序之间进行通信. Ring支持的效果: 先进先出 最大大小是固定的,指针存储在表中 无锁实现 多消费者 ...
- (精简理解)DPDK的无锁环形队列Ring
这里写目录标题 1. DPDK Ring简介 2. Ring实现 2.1 单一生产者入队 2.2 单一消费者出队 2.3 多个生产者入队 2.4 多个消费者出队 3 总结 3.1 入队列 3.2 出队 ...
- 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)
Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...
- 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)
Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...
- Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)
Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...
- 《深入浅出DPDK》读书笔记(五):同步互斥机制
本文内容为读书笔记,摘自<深入浅出DPDK> 56.原子操作 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为& ...
- 利用dpdk rte_ring实现进程间通信
进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存.关于共享内存的实现方式,双方可以通过mmap方式去映射到相同的内存上进而实现内存共享. DPDK实现的rin ...
- 数据平面开发套件:DPDK
摘要:DPDK,是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,是在数据平面应用中为快速的数据包处理提供一 ...
- DPDK — 数据平台优化技术
目录 文章目录 目录 DPDK 优化技术 DPDK 性能影响因素 硬件结构的影响 OS 版本及其内核的影响 OVS 性能问题 内存管理 CPU 核间无锁通信 设置正确的目标 CPU 类型与模式 优化方 ...
最新文章
- poj 3321 Apple Trie
- dict过滤 python_关于python:过滤dict以只包含某些键?
- 【视频】vue指令之@click及其stop修饰符
- fedora7 常用软件安装
- Spring4.0学习笔记(3) —— Spring_Bean之间的关系
- JavaScript-预解析(变量提升)
- 4.RabbitMQ实战 --- 解决Rabbit相关问题:编码与模式,RPC
- java 字符串转换int_java IPV4字符串转int或long
- mysql数据库分表及实现
- 人体运动生物力学之人体步态分析
- QQ群排名霸屏:快速上排名方法
- 吾生有涯 而知也无涯
- CF1144C - Two Shuffled Sequences
- excel日期相减去除周末_在Excel中突出显示周末日期
- oracle存储过程初学实例
- 一只小北极熊(结构体
- java trim函数的使用方法_java trim的用法实例详解
- 硬核!解密四向穿梭车智能化密集存储技术
- Mac系统如何查看更新R版本
- 公司职员信息管理系统