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

1.各个进程间ARP包的广播
2.KNI的转发
3.与工具(sysctl等)进行通信。

rte_ring是一个用CAS实现的无锁FIFO环形队列,支持多消费者/生产者同时出入队列,常用于多线程/多进程之间的通信。具体原理可以查看DPDK官方文档或者阅读源码,本文主要是介绍如何使用rte_ring来进行多进程间通信。

rte_ring需要与rte_mempool配合使用,通过rte_mempool来共享内存。

首先primary进程创建ring和mempool,secondary进程在primary进程启动后,通过rte_ring_lookuprte_mempool_lookup来获取ring和mempool的地址。

primary:

    // flags:标识是单消费者/生产者或者多消费者/生产者struct rte_ring *ring = rte_ring_create("message_ring", ring_size, rte_socket_id(), flags);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);

secondary:

    struct rte_ring *ring = rte_ring_lookup("message_ring");struct rte_mempool *message_pool = rte_mempool_lookup("message_pool");

使用时,rte_mempool_get从mempool中获取一个对象,然后使用rte_ring_enqueue入队列,另一个进程通过rte_ring_dequeue来出队列,使用完成后需要rte_mempool_put将对象放回mempool。

sender:

    void *msg = NULL;if (rte_mempool_get(message_pool, &msg) < 0)pannic();snprintf((char *)msg, string_size, "%s", "helloworld");if (rte_ring_enqueue(ring, msg) < 0) {rte_mempool_put(message_pool, msg);}

receiver:

    while (!quit){void *msg;if (rte_ring_dequeue(recv_ring, &msg) < 0){usleep(5);continue;}printf("Received: '%s'\n", (char *)msg);rte_mempool_put(message_pool, msg);}

实际代码可以参考dpdk example/multi_process/simple_mp 或者F-Stack lib/ff_dpdk_if.c和tools/ipc,非常简单易用。

本文分享自微信公众号 - FStack(F-Stack),作者:F-Stack

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

用DPDK rte_ring实现多进程间通信相关推荐

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

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

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

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

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

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

  4. 飞凌嵌入式iMX8MP 开发板试用体验--编译内核源码

    FETMX8MP-C核心板基于NXP i.MX 8M Plus处理器开发设计,该系列处理器专注于机器学习与视觉.高级多媒体以及具有高可靠性的工业自动化.旨在满足智慧城市.工业互联网.智能医疗.智慧交通 ...

  5. 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 ...

  6. 对dpdk的rte_ring实现原理和代码分析

    对dpdk的rte_ring实现原理和代码分析 前言 dpdk的rte_ring是借鉴了linux内核的kfifo实现原理,这里统称为无锁环形缓冲队列. 环形缓冲区通常有一个读指针和一个写指针.读指针 ...

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

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

  8. DPDK学习(二)DPDK多进程支持

    在DPDK中,多进程支持旨在允许一组DPDK进程以简单的透明方式协同工作,以执行数据包处理或其他工作负载.为了支持此功能,已经对核心的DPDK环境抽象层(EAL)进行了一些增加. EAL已被修改为允许 ...

  9. DPDK — OvS-DPDK

    目录 文章目录 目录 架构 OvS 架构 OvS-DPDK 架构 架构 OvS 架构 openvswitch.ko :在内核态负责 "快速路径" 的数据转发.转发靠流表来完成,每一 ...

最新文章

  1. 7、redis之使用spring集成commons-pool来操作常见数据类型
  2. C++vector容器学习
  3. 文巾解题 1877. 数组中最大数对和的最小值
  4. UNITY 多SCENE加载与编辑
  5. 如何在SAP WebClient UI里使用HANA Live report
  6. 网站搭建从零开始(五) WordPress的安装
  7. es修改type名称_ElasticSearch如何修改索引字段
  8. 自定义PopView
  9. SQOOP的安装配置_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休!
  10. catia三边倒角_CATIA课时:操作工具栏创建倒角倒圆角视频教程_翼狐网
  11. 数据分析师工资高达50万,正在进入每一个行业!
  12. 后端工程师第一周实习笔记(实习面试必知大学课堂上却没讲的知识点)
  13. 如何用十六进制换算十进制
  14. 【车载以太网】【SOME/IP】规范标准
  15. Java-使用集合存储快递的信息
  16. 陕西大学最早的计算机专业,2019计算机考研:陕西地区计算机专业优质院校
  17. 一步一步实现一个Web Server-03
  18. NFPA 855-2020+勘误+增补【中文】 固定式储能系统的安装标准
  19. matlab stem 属性,matlab中stem函数用法_常见问题解析
  20. 蓝牙协议分析仪---BPA600使用介绍

热门文章

  1. 【UML关系(泛化、实现、依赖、关联(聚合,组合))】
  2. Kafka Manager界面添加Partition
  3. 第0次作业 -- 博客园作业提交方法
  4. OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书
  5. javascript进行遍历
  6. 【总结】C++逻辑与或
  7. BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
  8. 八十第五个冠军(复制和匹配的字符串)
  9. 计算机考研分析题,2020计算机考研,易错题分析与常考点总结
  10. 元气骑士如何获得机器人成就皮肤_元气骑士:获得成就叹息之墙,花圃免费开,附带5000蓝币奖励...