dpdk基础模块之rte_ring

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;
}
时间: 2024-10-05 23:50:08

dpdk基础模块之rte_ring的相关文章

dpdk基础模块之rte_mbuf详解

Rte_mbuf 本文假定报文的长度不超过rte_mbuf->buf_len的长度. 内存结构 分配操作 Mbuf由缓冲池rte_mempool管理,rte_mempool在初始化时一次申请多个mbuf,申请的mbuf个数和长度都由用户指定.宏MBUF_SIZE是例子程序中使用的mbuf长度: #define MBUF_SIZE (2048 + sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM) 用下面函数向rte_mempool申请一个mbuf: s

node.js基础模块http、网页分析工具cherrio实现爬虫

node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherrio. 使用http直接获取url路径对应网页资源,然后使用cherrio分析. 这里我主要学习过的案例自己敲了一遍,加深理解.在coding的过程中,我第一次把jq获取后的对象直接用forEach遍历,直接报错,是因为jq没有对应的这个方法,只有js数组可以调用. 二.知识点    ①:supera

Python3 基础 —— 模块 Module 介绍

1.模块的作用 在交互模式下输出的变量和函数定义,一旦终端重启后,这些定义就都不存在了,为了持久保存这些变量.函数等的定义,Python中引入了模块(Module)的概念.一个Python模块其实就是一个脚本文件,具有后缀".py",例如 hello.py 就是一个模块文件名,和普通文件一样可以被永久保存在本地存储磁盘中. 2.模块的内容 Python模块中存放的是一些程序代码,例如,变量定义.函数定义或是代码语句.下面是hello.py模块的内容,其中有一个变量 a,一个函数 fun

ASP.NET MVC +EasyUI 权限设计(三)基础模块

请注明转载地址:http://www.cnblogs.com/arhat 在上一章中呢,我们基本上搭建好了环境,那么本章我们就从基础模块开始写起.由于用户,角色,动作三个当中,都是依赖与动作的,所以本章我们从动作开始做起,先把这个基础模块建立起来,然后才能把用户,角色和动作关联起来形成权限. 首先建立一个新的Controller为ActionController,为其Index方法创建一个视图文件,由于这样的视图文件太多了,而且重复性的代码也比较多,所以我们把共有的部分移植到Views/Shar

Puppet 通过基础模块、类、节点正则表达式批量管理Apache服务器

=> 创建httpd基础模块 # mkdir /etc/puppet/modules/httpd/{files,manifests,templates} -pv  # tree /etc/puppet/modules/httpd/ /etc/puppet/modules/httpd/ ├── files  //基础模块所调用的配置文件,agent可以通过puppet协议将files目录所定义的文件下载到本地. ├── manifests   //主要存放基础模块所使用的类文件及相关资源,如ini

Ansible 安装 及 基础模块介绍

ansible 介绍 Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令部署程序.配置系统等功能.默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单.可同时支持多台主机并行管理,使得管理主机更加便捷. ansible 安装 在管理端与 被管理端都要安装 yum install -y epel-release ##安装epel源 yum install ansible -y ansible --versio

自动化运维系列之Ansible命令应用基础(模块的应用)【持续更新中···】

自动化运维系列之Ansible命令应用基础(模块的应用) 模块简介 Ansible可以使用命令行方式进行自动化管理,基本语法如下: ansible <host-pattern> [-m module_name] [-a args] <host-pattern> 对哪些主机生效 [-m module_name] 需要使用的模块 [-a args] 模块特有的参数,这里在使用时需加单引号哦! Ansible的命令行管理工具都是由一系列模块.参数所支持的,可以在命令行后加上-h或--he

常用的基础模块介绍

模块,是用一堆代码来实现某个功能的代码集合类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码来调用该功能,提供了代码的重用性和代码间的耦合性而对于一个复杂的功能,可能需要多个函数才能完成,这些文件组成的代码集合称为模块模块分为三种:自定义模块:内置标准模块:开源模块模块一:datetime和time 1 import time 2 print("返回标准时间(含年月日等信息):",time.asctime()) 3 print("返回本地时间的struct t

爬虫基础模块

Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作.