博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用dpdk rte_ring实现进程间通信
阅读量:4204 次
发布时间:2019-05-26

本文共 1636 字,大约阅读时间需要 5 分钟。

进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存。关于共享内存的实现方式,双方可以通过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获取到这个ringstruct rte_ring *ring = rte_ring_create("message_ring", ring_size, rte_socket_id(), flags);//创建message_pool,secondary程序中会通过pool name获取到这个poolstruct 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);}

 

转载地址:http://pyali.baihongyu.com/

你可能感兴趣的文章
【一天一道LeetCode】#75. Sort Colors
查看>>
【一天一道LeetCode】#76. Minimum Window Substring
查看>>
【计算机网络 第五版】阅读笔记之一:概述
查看>>
【计算机网络 第五版】阅读笔记之二:物理层
查看>>
【一天一道LeetCode】#83. Remove Duplicates from Sorted List
查看>>
【一天一道LeetCode】#91. Decode Ways
查看>>
【一天一道LeetCode】#92. Reverse Linked List II
查看>>
【一天一道LeetCode】#93. Restore IP Addresses
查看>>
【一天一道LeetCode】#94. Binary Tree Inorder Traversal
查看>>
【一天一道LeetCode】#113. Path Sum II
查看>>
【一天一道LeetCode】#114. Flatten Binary Tree to Linked List
查看>>
【unix网络编程第三版】阅读笔记(二):套接字编程简介
查看>>
【一天一道LeetCode】#115. Distinct Subsequences
查看>>
【一天一道LeetCode】#116. Populating Next Right Pointers in Each Node
查看>>
【一天一道LeetCode】#117. Populating Next Right Pointers in Each Node II
查看>>
【一天一道LeetCode】#118. Pascal's Triangle
查看>>
【一天一道LeetCode】#119. Pascal's Triangle II
查看>>
【unix网络编程第三版】ubuntu端口占用问题
查看>>
【一天一道LeetCode】#120. Triangle
查看>>
【unix网络编程第三版】阅读笔记(三):基本套接字编程
查看>>