进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存。关于共享内存的实现方式,双方可以通过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实现进程间通信相关推荐

  1. 用DPDK rte_ring实现多进程间通信

    F-Stack是多进程架构,去除了进程间资源共享来达到更高的性能,但还是有部分控制信息需要在进程间同步,使用rte_ring让多个进程间的通信变得十分简单. rte_ring在F-Stack中主要用于 ...

  2. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  3. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  4. SDN实战团技术分享(三十八):DPDK助力NFV与云计算

    DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理. 什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库:对于开发者来说,它可能是一个实 ...

  5. DPDK 数据包捕获基本流程(十六)

    内核组件架构 rte_eal+libc:内存的统一组织管理者,但是在这它不只是做内存工作. librte_malloc:对外提供分配释放内存的API,分配的内存都是rte_eal中所管理的内存. li ...

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

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

  7. 一个高速lvs-dr替代系统设计 -- 基于dpdk的高性能负载均衡器

    # LVS DR 原理 LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层.haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy ...

  8. DPDK — CLI 指令行模块

    目录 文章目录 目录 DPDK CLI 初始化命令行 命令行解析 命令行的参数 命令行的功能 参考文档 DPDK CLI 当我们开发一个 DPDK App 时,可以利用 DPDK 提供的 CLI 工具 ...

  9. Unix网络编程--进程间通信--管道通信

          所有式样的Unix都提供管道,它由 pipe 函数创建,提供一个单路(单向)数据流.       原型如下: #include <unistd.h> int pipe(int ...

最新文章

  1. EF6 MySQL错误之“Specified key was too long; max key length is 767 bytes”
  2. 这么全的数组去重,你怕不怕?
  3. redis中执行lua脚本命令
  4. mysql主从复制深入研究_mysql主从复制原理,深入探讨
  5. eclipse juno_放弃Eclipse Juno
  6. 【Python】Python迭代求解开平方算法
  7. windows 下 opencv 3.x 的安装及常见问题的解决
  8. hadoop之MapReducer作业的提交执行过程
  9. html5华迪,比亚迪永通华迪4S店:元新能源最低售8.19万
  10. c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
  11. 数据工程师岗位职责解析
  12. 泊松分布(Poisson Distribution)
  13. Flask-mongoengine分页bug
  14. java阿里天气接口_天气预报接口
  15. 号码归属地及运营商查询工具
  16. linux 批量ping检测
  17. python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据
  18. 关于recvfrom接收超时
  19. 阻抗和电抗的基本概念
  20. 视频编解码学习:理论基础

热门文章

  1. MANIFEST.MF是个什么?
  2. 剑指 Offer 21-30
  3. txt,csv,json互相转化
  4. Sentinel -- sentinel控制台的简单应用
  5. android p新功能_android 11 android的11大新功能
  6. 基于单片机的运动监测控制系统设计
  7. 【网易邮箱】换绑安全手机(①之前的手机号注销了怎么办 ②网易人工客服在哪)
  8. 运动控制器多工位位置比较输出在转盘式视觉筛选设备中的应用
  9. 在Python中画炫酷的K线图
  10. 图的可视化问题、havel-hakimi算法、Erdős–Gallai定理