博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dpdk基础模块之rte_ring
阅读量:6863 次
发布时间:2019-06-26

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

rte_ring是一个无锁队列,无锁队列的出队入队操作是rte_ring实现的关键。因此,本文主要讲解dpdk是怎样使用无锁机制实现rte_ring的多生产者入队操作。

 

rte_atomic32_cmpset()称为CAS(compare and set)操作,是无锁队列实现的关键,实现的伪代码如下:

cmpset(cur, old, next){    if (cur == old) {        cur = next;    }}

rte_atomic32_cmpset()实现基于gcc内置CAS操作:

__sync_bool_compare_and_swap()

 

rte_compiler_barrier()

该操作主要保证此语句后的代码执行顺序不被编译器优化。

 

多生产者入队(mp-enqueue)

/* * 该函数保证多个生产者按顺序入队,而第一步则是给多个生产者排序的过程, * 最先移动r->prod.head位置的生产者排序最靠前,排序靠前的生产者也可以 * 优先执行第二步和第三步。*/mp_do_enqueue(r, obj, n){    /* 1. 抢占移动prod.head */    do {        prod_head = r->prod.head;        cons_tail = r->cons.tail;                /* check that we have enough room in ring */        CHECK_REMAIN_ROOM()                prod_next = prod_head + n;        success = rte_atomic32_cmpset(&r->prod.head, prod_head, prod_next);    } while (success == 0);        /* 2. 元素插入合适位置 */    ENQUEUE_PTRS();    rte_compiler_barrier();        /* 3. 顺序移动prod.tail */    while (unlikely(r->prod.tail != prod_head))        rte_pause();            r->prod.tail = prod_next;}

转载于:https://www.cnblogs.com/ziding/p/4246170.html

你可能感兴趣的文章
iOS原生定位和反编码
查看>>
华为交换机配置命令 华为QuidWay交换机配置命令手册
查看>>
如何解决JSP页面的乱码问题
查看>>
SQL中的Null值
查看>>
细看晶圆代工之争,纳米制程是什么
查看>>
东软java实训第一个项目人力资源管理
查看>>
我的友情链接
查看>>
ESXI GLusterFS ISCSI 构建低端虚拟化解决方案
查看>>
mysql使用
查看>>
[Ubuntu 12.10] Openstack 多节点安装--前期准备&&网络拓扑
查看>>
zipkin部署
查看>>
JavaScript调用Applet的函数
查看>>
eclipse折叠所有代码快捷键
查看>>
Character
查看>>
关于visualizer的setEnabled()方法何时进行设置成false?
查看>>
微信小程序把玩(二十八)image组件
查看>>
捕捉mysql中不可忽视的知识点(二)
查看>>
我的友情链接
查看>>
Cisco 3560 丢失 IOS 解决过程
查看>>
C语言初学者简单语法综合练习
查看>>