前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用DPDK rte_ring实现多进程间通信

用DPDK rte_ring实现多进程间通信

作者头像
F-Stack
发布2018-01-31 10:32:35
3.5K0
发布2018-01-31 10:32:35
举报
文章被收录于专栏:F-Stack的专栏F-Stack的专栏

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
    // 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:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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,非常简单易用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档