• DPDK 无锁操作


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

    static inline int
    rte_atomic32_cmpset(volatile uint32_t *dstuint32_t expuint32_t src)
    {
        uint8_t res;

        asm volatile(
            MPLOCKED
            "cmpxchgl %[src], %[dst];"
            "sete %[res];"
            : [res] "=a" (res),     /* output */
            [dst] "=m" (*dst)
            : [src] "r" (src),      /* input */
            "a" (exp),
            "m" (*dst)
            : "memory");            /* no-clobber list */
        return res;
    }

    输入操作数为*dst(memory内存)、exp(存放于eax寄存器)、src(任意可用通用寄存器)

    CAS有3个操作数,内存值*dst,旧的预期值exp,要修改的新值src, 当且仅当预期值exp和内存值*dst相同时,将内存值*dst修改为src,否则什么都不做。

    这个函数是如何保证CAS原子操作的呢?

    MPLOCKED前缀就是锁总线,该前缀后面的指令编译成机器码后就可以使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样别的CPU就暂时不能通过该总线访问内存了,确保同一时间只有一个CPU线程能操作这块内存。

    cmpxchgl指令就是被lock住总线的指令,用于比较并交换操作数,这个指令是原子的。cmpxchgl比较eax(也就是exp)与 *dst的值,如果相等,那么将src的值赋值给*dst,同时标志寄存器ZF位置1;否则,将*dst的值赋值给eax,并且将标志寄存器ZF位置0

    写完之后,通过cache一致性协议保证所有其他CPU看到同一块实际内存值的更新

    sete,如果标志寄存器ZF位为1,那么设置res为1否则设置为0

    :”memory” 是优化屏障,防止编译器优化有顺序要求的代码

    目标内存dst必须是volatile 修饰的,编译器每次遇到这个变量都从内存读值,而不从CPU自己的缓存或寄存器读值。

    "=a"指定output operand应遵守的约束(constraint),res为存放指令结果的变量

    “a”表示先将命令执行结果输出至eax寄存器,然后再由eax更新位于内存中的res

          如果这时候eax已经被使用,那怎么办?
          其实很简单:因为GCC 知道eax 已经被使用,它在这段汇编代码
          的起始处插入一条语句pushl %eax,将eax 内容保存到堆栈,然
          后在这段代码结束处再增加一条语句popl %eax,恢复eax的内容

    "=m"表示不通过寄存器中转,而是直接操作内存

     "r" 将输入变量放入通用寄存器,也就是eax,ebx,ecx,edx,esi,edi中的一个

    volatile + lock +  cmpxchgl指令 + 缓存一致性模型 + 优化屏障 = 原语CAS

  • 相关阅读:
    PHP错误:Fatal error: session_start() 解决办法
    Flash 随机生成多个显示元件的ActionScript代码
    CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!
    DB: 20 个数据库设计最佳实践
    ActionScript 3.0 组件!
    FLASH ActionScript 3.0 sns cocial game 开发中的定时器
    PHP 获取用户真实IP
    我想成为坐在路边鼓掌的人
    Mobile + Web 并举的Social Game开发模式
    addEventListener & removeEventListener || attachEvent & detachEvent
  • 原文地址:https://www.cnblogs.com/dream397/p/13666774.html
Copyright © 2020-2023  润新知