DPDK深度解析:ring环在代码中的应用示例

DPDK深度解析:ring环在代码中的应用示例一个ring环的例子例子的位置在dpdk-stable-18.11.2/examples/packet_ordering我们下载的dpdk版本是

大家好,欢迎来到IT知识分享网。

今天我们看一个ring环在项目中的使用。我们选的例子是dpdk官方提供的使用实例。

一个ring环的例子

例子的位置在

dpdk-stable-18.11.2/examples/packet_ordering

我们下载的dpdk版本是dpdk-stable-18.11.2

例子packet_ordering是展示packet ordering的,里面需要多线程之间传递报文,使用的是ring。

DPDK深度解析:ring环在代码中的应用示例

如上图,这是代码实现的线程、ring环组成的报文处理流程

1、 接收线程rx_thread(1个线程)

2、 报文处理线程worker_thread(若干个)

3、 发送线程send_thread(1个)

报文由rx_thread接收,经过ring环(rx_to_workers),发送给worker_thread线程处理报文,处理后通过ring环(workers_to_tx)发送给发送线程send_thread。

代码中看创建ring

DPDK深度解析:ring环在代码中的应用示例

1、 创建了两个ring环;

2、 分别是rx_to_workers 和workers_to_tx。这两个名称是标识ring的位置标志,不会重复,并且每个ring唯一一个名称。

3、 rte_socket_id,ring必须归属于一个唯一的socket,即现有的服务器框架都是多numa框架,标识这个ring是属于哪一个numa的。

4、 rx_to_workers这个ring的参数RING_F_SP_ENQ,SP_ENQ,意思是single product enquence,即单个消息产出并入ring的环,说明这个ring环是一个线程进行消息入环。

5、 workers_to_tx这个ring的参数RING_F_SC_DEQ,同理,SC DEQ 意思是single consumer dequence,即出ring的线程是单个线程。

线程入ring和出ring代码

rx_thread入ring代码

/* enqueue to rx_to_workers ring */

ret = rte_ring_enqueue_burst(ring_out,(void *)pkts, nb_rx_pkts, NULL);

worker_thread线程读ring的代码

/* dequeue the mbufs from rx_to_workers ring */

burst_size = rte_ring_dequeue_burst(ring_in,(void *)burst_buffer, MAX_PKTS_BURST, NULL);

worker_thread线程入ring的代码

/* enqueue the modified mbufs to workers_to_tx ring */

ret = rte_ring_enqueue_burst(ring_out, (void *)burst_buffer,burst_size, NULL);

send_thread读ring的代码

/* deque the mbufs from workers_to_tx ring */

nb_dq_mbufs = rte_ring_dequeue_burst(args->ring_in,(void *)mbufs, MAX_PKTS_BURST, NULL);

DPDK深度解析:ring环在代码中的应用示例

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/83050.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信