首页 > 其他分享 >18 同步与异常(四) 原子操作

18 同步与异常(四) 原子操作

时间:2023-04-19 22:24:39浏览次数:29  
标签:同步 18 原子 ATOMIC atomic nr asm op

1 简介

原子操作此操作是不会被打断的

2 ldrex、strex、teq

  • ldrex

    相对ldr而言此命令多了ex(exclude排除),意为独占

    eg: 将会对ldr r0, r1命令中的r1标记为独占

  • strex

    相较于str基本功能而言多出清除独占标记

    eg: strex r2, r0, r1

    将r0写入r1,并清除r1的独占标记。成功将r2设为0,如果r1已经被清掉了独占择将r2设为1

  • teq

    测试两个操作数是否相等

3 常用API和数据结构

3.1 原子变量数据结构

本质上原子变量是一个结构体

typedef struct {
	int counter;
} atomic_t;

3.2 原子操作

原子的操作变量v需要为原子变量atomic_t

  • atomic_read(v)

    读出原子操作

  • atomic_set(v)

    设置原子值

  • atomic_inc(v)

    自加

  • atomic_dec(v)

    自减

  • atomic_add(i, v)

    加i

  • atomic_sub(i, v)

    减i

  • atomic_inc_and_test(v)

    先加1,判断是否等于0。如果等于0就返回1

  • atomic_dec_and_test(v)

    先减1,判断是否等于0。如果等于0就返回1

  • set_bit(nr, p)

    设置p的nr为1

  • clear_bit(nr, p)

    设置p的nr为0

  • change_bit(nr, p)

    改变p的nr反转

  • test_and_set_bit(nr, p)

    设置p的nr为1,但是返回改位老值

  • test_and_clear_bit(nr, p)

    设置p的nr为0,但是返回该位老值

  • test_and_change_bit(nr, p)

    设置p的nr反转,返回该位的老值

4 内核原子操作的实现

原子操作分为单核和SMP两种类型,即ARMv6以上和以下

原子加减的实现是通过宏进行展开实现相关函数的定义的

#define ATOMIC_OPS(op, c_op, asm_op)                                    \
        ATOMIC_OP(op, c_op, asm_op)                                     \
        ATOMIC_OP_RETURN(op, c_op, asm_op)                              \
        ATOMIC_FETCH_OP(op, c_op, asm_op)

ATOMIC_OPS(add, +=, add)
ATOMIC_OPS(sub, -=, sub)

4.1 单核实现逻辑

直接关中断

#define ATOMIC_OP(op, c_op, asm_op)                                     \
static inline void atomic_##op(int i, atomic_t *v)                      \
{                                                                       \
        unsigned long flags;                                            \
                                                                        \
        raw_local_irq_save(flags);            /* 关中断,并保存当前状态 */                          \
        v->counter c_op i;                                              \
        raw_local_irq_restore(flags);         /* 恢复之前终端状态 */                          \
} 

4.2 SMP实现逻辑

#define ATOMIC_OP(op, c_op, asm_op)                                     \
static inline void atomic_##op(int i, atomic_t *v)                      \
{                                                                       \
        unsigned long tmp;                                              \
        int result;                                                     \
                                                                        \
        prefetchw(&v->counter);                                         \
        __asm__ __volatile__("@ atomic_" #op "\n"                       \
"1:     ldrex   %0, [%3]\n"                       @ 取出原子变量的值,并将原子变量的寄存器做好标记                    \
"       " #asm_op "     %0, %0, %4\n"             @ 将i的值与原子变量的值相加                      \
"       strex   %1, %0, [%3]\n"                   @ 将计算结果放入原子变量,并尝试解锁之前的标记;结果存入%1寄存器                      \
"       teq     %1, #0\n"                         @ %1寄存器如果等于0则向下指令,否则退出放回结果                      \
"       bne     1b"                               @ %1清标记失败,将跳转到1处继续执行                      \
        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)               \
        : "r" (&v->counter), "Ir" (i)                                   \
        : "cc");                                                        \
} 

从汇编源码中可以看到如果原子操作的过程中存在并发操作,则会丢弃此次执行结果。
所以从宏观上看原子操作便是不可被中断的

标签:同步,18,原子,ATOMIC,atomic,nr,asm,op
From: https://www.cnblogs.com/burnk/p/17334851.html

相关文章

  • FS2455高效率的同步降压DC-DC转换器5A输出电流
    概述FS2455是一种高效率的同步降压DC-DC转换器,具有5A输出电流。 FS2455在4.5V到30V的宽输入电压范围内工作, 集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失。 FS2455具有轻载时的应用和高效率。此外,它的工作频率是恒定的在连续导通模式下为500kHz,以使电感器和电容器的......
  • CF 1820A-Yura's New Name, 800 / 思维 / ^-^ 或 ^^ 才合法
    CF1820A-Yura'sNewName处理方式:特殊情况提前判断+一般情况从首推到尾#include<iostream>#include<cstring>usingnamespacestd;constintN=1e2+10;typedeflonglongLL;intT;strings;intmain(){cin>>T;while(T--){......
  • 20230418 >windows11 slmgr/ ato 命令和kms server
    Problems:1使用win11不打算使用微软账户,如何绕过2重装Windows11或者用virtualmachines搬运都得用到的,如何临时激活。这个作为testing用途,请勿用作商业用途。 SolutionstepA:重装的时候会遇到windows11在oobe界面下要求登入Microsoft账号,但由于只是作为测试用途......
  • Atcoder Regular Contest 118 E - Avoid Permutations(容斥+DP)
    挺套路的DP。第一步是显然的:转换贡献体,DP一条从\((0,0)\)到\((n+1,n+1)\)的路径,然后计算有多少个排列满足这条路径不经过任何一个\((i,p_i)\)。正着统计肯定不好求,考虑容斥。即我们钦定一些路径上的点,满足这些点必须对应某个\((i,p_i)\),然后计算有多少个\(p\)符合这个......
  • ubuntu18.04 ORB-SLAM3编译运行
    如何编译?1、代码下载;gitclonehttps://github.com/UZ-SLAMLab/ORB_SLAM3或者gitclonehttps://github.com/electech6/ORB_SLAM3_detailed_comments2、按照里面的README.md进行环境安装和编译;安装和编译过程中可能会出现的问题:1)提示找不到GLEW解决方法:sudoaptinstallli......
  • 2023年windows DockerDeskTop最新款4.18.0 全程保姆级安装
    目录前景提示windows10内置的linux系统1.这个内置系统一定要在windowsstore里安装,否则,无法使用,这是重点。进入商店,搜索linux。2.一般画圈这些都可以使用。4.安装会让你输入微软账户密码(首次)。5.静静等待,本作的这个大概550M左右。6.装好后,会生成一个图标(像应用程序一样,双击......
  • 4.18趣味百题12题
    一问题描述一个人拥有x现金要存y年(y年后取出)银行有几款不同的期限的月息利率超出初始存款的钱会给利息(与原题不同的拓展)求出利息最多的方案.月利息  期限0.63%  一年0.66%  两年0.69%  三年0.75%  五年0.84%  八年 二思路设计每种方案单独设计......
  • UnrealEngine - 网络同步之连接篇
    1连接过程-握手传统的C/S架构下,Client和Server通常会建立一条抽象的Connection,用来进行两端的通信。UE的官方文档中提供了Client连接到Server的示例,简单来说分为如下几步:打包构建好Client和Server进程启动Server进程,启动参数为./Binaries/Win64/<PROJE......
  • 云时代,MySQL到ClickHouse数据同步产品对比推荐
    ClickHouse在执行分析查询时的速度优势很好的弥补了MySQL的不足,但是对于很多开发者和DBA来说,如何将MySQL稳定、高效、简单的同步到ClickHouse却很困难。本文对比了NineData、MaterializeMySQL(ClickHouse自带)、Bifrost三款产品,看看他们在同步时的差异。对比结果概述整体上......
  • 产品原型15-20230418
               ......