利用dpdk rte_ring实现进程间通信
进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存。关于共享内存的实现方式,双方可以通过mmap方式去映射到相同的内存上进而实现内存共享。
DPDK实现的ring也可以帮助我们方便的实现高效率的进程间通信。具体方法如下。
1.rte_ring需要与rte_mempool配合使用,通过rte_mempool来共享内存。
2.primary进程通过rte_ring_create和rte_mempool_create分别创建ring和mempool。
3.secondary进程在primary进程启动后执行,通过rte_ring_lookup和rte_mempool_lookup来获取ring和mempool的地址。
通过上面三个步骤,我们就可以简单的实现一个基于dpdk ring的进程间通信demo
primary进程代码:
//创建一个ring,secondary程序中会通过ring name获取到这个ring
struct rte_ring *ring = rte_ring_create("message_ring", ring_size, rte_socket_id(), flags);//创建message_pool,secondary程序中会通过pool name获取到这个pool
struct rte_mempool *message_pool = rte_mempool_create("message_pool", pool_size,string_size, pool_cache, 0,NULL, NULL, NULL, NULL,rte_socket_id(), flags);void *msg = NULL;//从创建的message_pool中获取一个元素。在dpdk收发包逻辑中,这个msg是rte_mbuf的结构,在这里我们可以根据自己的需要定义不同的结构
if (rte_mempool_get(message_pool, &msg) < 0)return -1;//测试,给msg赋值
snprintf((char *)msg, string_size, "%s", "helloworld");
//将msg入队
if (rte_ring_enqueue(ring, msg) < 0)
{//失败处理,如果入队失败,则把元素放回到pool中。如果成功,这个操作将由secondary进程进行rte_mempool_put(message_pool, msg);
}
secondary代码:
//根据primary进程中指定的name获取ring和pool的地址
struct rte_ring *ring = rte_ring_lookup("message_ring");
struct rte_mempool *message_pool = rte_mempool_lookup("message_pool");void *msg;
while(1)
{//从ring中获取元素if (rte_ring_dequeue(recv_ring, &msg) < 0){//some handlescontinue;}printf("Received: '%s'\n", (char *)msg);//将元素放回到poll中。如果元素出队失败,这个操作将有primary进程执行rte_mempool_put(message_pool, msg);
}
利用dpdk rte_ring实现进程间通信相关推荐
- 用DPDK rte_ring实现多进程间通信
F-Stack是多进程架构,去除了进程间资源共享来达到更高的性能,但还是有部分控制信息需要在进程间同步,使用rte_ring让多个进程间的通信变得十分简单. rte_ring在F-Stack中主要用于 ...
- java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...
- 绝对干货!初学者也能看懂的DPDK解析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...
- SDN实战团技术分享(三十八):DPDK助力NFV与云计算
DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理. 什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库:对于开发者来说,它可能是一个实 ...
- DPDK 数据包捕获基本流程(十六)
内核组件架构 rte_eal+libc:内存的统一组织管理者,但是在这它不只是做内存工作. librte_malloc:对外提供分配释放内存的API,分配的内存都是rte_eal中所管理的内存. li ...
- 《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)
Table of Contents DPDK应用篇 DPDK与网络功能虚拟化 157.网络功能虚拟化 13.1.1起源 158.发展 159.OPNFV与DPDK NFV的部署 160.NFV的部署 ...
- 一个高速lvs-dr替代系统设计 -- 基于dpdk的高性能负载均衡器
# LVS DR 原理 LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层.haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy ...
- DPDK — CLI 指令行模块
目录 文章目录 目录 DPDK CLI 初始化命令行 命令行解析 命令行的参数 命令行的功能 参考文档 DPDK CLI 当我们开发一个 DPDK App 时,可以利用 DPDK 提供的 CLI 工具 ...
- Unix网络编程--进程间通信--管道通信
所有式样的Unix都提供管道,它由 pipe 函数创建,提供一个单路(单向)数据流. 原型如下: #include <unistd.h> int pipe(int ...
最新文章
- EF6 MySQL错误之“Specified key was too long; max key length is 767 bytes”
- 这么全的数组去重,你怕不怕?
- redis中执行lua脚本命令
- mysql主从复制深入研究_mysql主从复制原理,深入探讨
- eclipse juno_放弃Eclipse Juno
- 【Python】Python迭代求解开平方算法
- windows 下 opencv 3.x 的安装及常见问题的解决
- hadoop之MapReducer作业的提交执行过程
- html5华迪,比亚迪永通华迪4S店:元新能源最低售8.19万
- c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
- 数据工程师岗位职责解析
- 泊松分布(Poisson Distribution)
- Flask-mongoengine分页bug
- java阿里天气接口_天气预报接口
- 号码归属地及运营商查询工具
- linux 批量ping检测
- python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据
- 关于recvfrom接收超时
- 阻抗和电抗的基本概念
- 视频编解码学习:理论基础