利用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 handles
        continue;
    }

    printf("Received: '%s'\n", (char *)msg);
    //将元素放回到poll中。如果元素出队失败,这个操作将有primary进程执行
    rte_mempool_put(message_pool, msg);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值