Linux内核的原子操作

Linux内核同步原语之原子操作(Atomic) 原子操作 阅读详情

1、基本概念

原子操作可以保证指令以原子的方式执行,执行过程不被打断。它通过把读取和修改变量的行为包含在一个单步中执行,从而防止了竞争的发生,保证操作结果总是一致的。

例如:

int i=9;

线程1:

i++

i=9 OR i=8

线程2

i–;

i=9 OR i=8

两个线程并发的执行,导致结果不确定性。原子操作的作用和信号量机制是一样,都是为了防止同时访问临界资源,保证结果的一致性。大多数硬件体系结构要么本来就支持简单的原子操作,要么就为音频执行提供了锁内在总线的指令,例如x86平台上,就支持CPU锁总线操作,汇编指令前缀“LOCK”就可以将总线锁作,直到指令结束时锁打开;而有些硬件体系结构本身就不太支持原子操作,比如SPARC,但是Linux内核通过一些方法,做到了原子操作。

原子操作在Linux内核里分为原子整数操作和原子位操作,下面我们来看看这两个操作用法。

2、原子整数操作

针对整数的原子操作只能对atomic_t类型的数据进行处理,之所以没有用C语言的int类型,主要有两个原因:

1、让原子函数只接受atomic_t类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用,防止该类型数据不会传给其它非原子操作

2、使用atomic_t类型确保编译器不对相应的值进行访问优化

3、在不同体系结构上实现原子操作的时候,使用atomic_t可以屏蔽其间的差异。

尽管Linux的整型数据都是32位的,但是使用atomic_t的代码只能将将该类型的数据当作24位来用,我们看看atomic_t的数据

|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|

|      带符号24位整形数据        |   锁   |

|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|

|10987654321098765432109876543210|

| 3         2         1          |

|            32位atmoic_t         |

|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|

我们看到atomic_t中嵌入了一个8bit的锁,因为SPARC体系结构对原子操作缺乏指令级的支持,所以只能使用利用该锁来避免对原子类型数据的并发访问,对于原子操作的使用,看下面例子:

1 int a=3;
2 atomic_t v=ATOMIC_INIT(a);
3 atomic_add(&v,a);
4 atomic_inc(&v);


在上面例子中,我们先定义并初始化了一个atomic_t变量,再对其进行了加法、自加操作。在Linux内核中提供了一系统的原子整数操作函数。

原子整数操作描述
ATOMIC_INIT(int i)在声明一个atmoic_t变量时,将它初始化为i
ATOMIC_INIT(int i)在声明一个atmoic_t变量时,将它初始化为i
int atmoic_read(atmoic_t *v)原子地读取整数变量v
void atmoic_set(atmoic_t *v,int i)原子地设置v值为i
void atmoic_add(atmoic_t *v,int i)原子地从v值加i
void atmoic_sub(atmoic_t *v,int i)原子地从v值减i
void atmoic_inc(atmoic_t *v)原子地从v值加1
void atmoic_dec(atmoic_t *v)原子地从v值减1
int atmoic_sub_and_test(int i,atmoic_t *v)原子地从v值减i,如果结果等于0返回真,否则返回假
int atmoic_add_negative(int i,atmoic_t *v)原子地从v值减i,如果结果是负数返回真,否则返回假
int atmoic_dec_and_test(atmoic_t *v)原子地给v减1,如果结果等于0返回真,否则返回假
int atmoic_inc_and_test(atmoic_t *v)原子地给v加1,如果结果等于0返回真,否则返回假

原子操作最常见的用途就是实现计数器,使用复杂的锁机制来保护一个单纯的计数是很笨拙的,原子操作比起复杂的同步方法来说,给系统带来的开销小,对高速缓存行的影响也小。

3、原子位操作

除了原子整数操作外,内核还提供了一组针对位这一级数据进行操作的函数,位操作函数是对普通的内在地址进行操作的,它的参数是一个指针和一个位号。由于是对普通的指针进程操作,所以没有像atomic_t这样的类型约束。

1 unsigned long word = 0;
2 set_bit(0,&word);
3 clear_bit(0,&word);
4 change_bit(0,&word);//翻转第0位的值


原子整数操作描述
void set_bit(int nr,void *addr)原子地设置addr所指对象的第nr位
void clear_bit(int nr,void *addr)原子地清空addr所指对象的第nr位
void change_bit(int nr,void *addr)原子地翻转addr所指对象的第nr位
int test_and_set_bit(int nr,void *addr)原子地设置addr所指对象的第nr位,并返回原先的值
int test_and_clear_bit(int nr,void *addr)原子地清空addr所指对象的第nr位,并返回原先的值
int test_and_change_bit(int nr,void *addr)原子地翻转addr所指对象的第nr位,并返回原先的值
int test_bit(int nr,void *addr)原子地返回addr所指对象的第nr位


sdc时钟约束2——多驱动时钟 sdc 多驱动时钟 master_clock 阅读详情

相关推荐

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现 BRDF简介 再介绍BRDF之前我们要引入渲染方程这个东西: 其中L表示辐射率,其公式为: 它表示了一个拥有辐射强度Φ的光源在单位面积A,单位立体角ω上的辐射出的总能量。 辐射率是辐射度量学上表示一个区域平面上光线总量的物理量,它受到入射光线与平面法线间的夹角θ的余弦值cosθ的影响:当直接...

小龙虾的博客 1万+

位原子操作

一、理论:1.并发 并发的概念是:多个执行单元同时、并行被执行。 Linux系统是多任务的,很多任务会同时执行。 假如有三个执行单元ABC,共享了内存资源。 执行单元A对Buffer写1000个“a”; 执行单元B对Buffer写1000个“b”; 执行单元C从buffer中读取数据。 如果按照A写→C读→B写→C读,当然没有问题。 但是如果A写→B写→C读,执行单元C就出问题了。 当然比这个复杂...

danwuxie的博客 1040

Cadence SIP Layout 简单教程-第一章

以摄像头模组软硬结合板为例,描述layout的整个完整过程,从而掌握基本技能。 第一章 准备工作 第一节 原理图不用说layout前需要绘制原理图,原理图不在本文讨论范围内,所以列为准备工作。 需要特别说明的是,绘制原理的最终目的是导出网络表,网络表中的重要参数footprint是让layout软件选择正确封装的关键,所以这里讲解一下原理图设置footprint的位置。在原理图中双击零件,...

whp1920的博客 1万+

linux原子操作

在这个示例中,使用了互斥锁pthread_mutex_t来保护临界区,确保对atomic_counter的递增操作是原子的。原子操作函数:Linux内核提供了一些原子操作函数,可以用于执行不可中断的原子操作。与Linux内核中的原子操作不同,用户空间的原子操作不是由硬件提供的原子指令,而是通过特殊的软件库函数或编译器内置函数来实现的。以下例子展示如何在Linux内核模块中使用原子操作函数来执行一个原子的计数器递增操作。Linux内核中的原子操作是一种操作,它是不可中断的,不会被其他处理器中断或调度的操作。

szqy00的博客 1997

别再乱设阻尼了!Abaqus动力分析中瑞利阻尼的α和β到底怎么算?

本文深入解析Abaqus动力分析中瑞利阻尼参数α和β的科学计算方法,帮助工程师准确设置阻尼参数以提升仿真精度。详细介绍了基于模态阻尼比的经典计算方法和多模态优化法,并结合工程案例演示参数设置流程,避免常见的阻尼设置误区。

weixin_42634811的博客 731

《Halcon 100项目-9》Halcon彩色线序检查

Halcon彩色线序检查

doubleintfloat的博客 1043

Linux原子操作

并发问题 现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题。假如一个任务正在读取文件一的情况下,此时又有另一个任务想要读取文件一,会造成读取混乱问题。可以使用原子操作实现资源互斥。 原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 1.设置原子变量的值 void atomic_set(atomic_t *v, int i); //设置原子变量的值为 i atomic_t v = ATOMIC_INIT(0); //定义原子变量 v 并初始化为 0

weixin_53318672的博客 3420

Pytorch.nn.Linear 解析(数学角度)

pytorch.nn.Linear 是一个类,下面是它的一些初始化参数 in_features : 输入样本的张量大小 out_features : 输出样本的张量大小 bias : 偏置 它主要是对输入数据做一个线性变换。 y=xAT+b y=xA^T+b y=xAT+b 这里A是权重矩阵,b是偏置。他们都是根据 in_features 生成 测试代码: m = torch.nn.Linea...

Medlen 1万+

linux内核的原子操作简述

linux内核原子操作简述

2115

关于UMI设备采集数据的模型训练方法

模仿学习如专家模型、VLA模型,ACT、DP、openpi等算法模型训练时,都是使用的机器人的绝对位姿或关节角;而UMI记录的轨迹是相对于UMI起始点的,可以理解为是相对于起点的绝对增量,对应到机器人中就是相对于末端TCP的增量。在用模型进行训练时,当然可以,但这样进行模型训练的话达不到跨本体的能力,因为模型本身还是学习的基于机器人base坐标系的绝对位姿关系,倘若用这种方式进行处理,则UMI可以理解为是一个遥操的方法,本质还是记录的机器人的state。在看了和。

boss-dog 421

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 634

Linux内核 原子操作分析

本文结合内核源码简单讲解了原子操作的实现过程。

cesheng3410的博客 1613

Arduino I2C for TCA9548A应答扫描程序

Arduino I2C for TCA9548A应答扫描程序

perseverance51博客 1119

Linux 内核原子操作

本文主要介绍了原子操作的一些相关用法。 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本文主要介绍了原子操作的一些相关用法。用于记录。 一、原子操作 原子操作可以保证对一个整型数据的修改是排他性的。Linux内核提供了一系列函数来实现内核中的原子操作,这些函数又分为两类,分别针对位和整型变量进行原子操作。位和整型变量的原子操作都依赖于底层CPU的原子操作,因此所有这些函数都与CPU架构...

qq_48709036的博客 2533

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux内核原子操作使用简介

驱动开发住常见的一个问题:就是一个驱动可以被多个进程同时打开,使用,这样会导致驱动功能混乱。 ./app & ./app & ./app 可以同时打开这个设备,可通过文件描述符调用驱动的其他接口操作这个设备。 如果想只一个进程使用这个设备,只需要在open接口函数做打开判断。 示例: static int open_flag = 0; //打开设备时候执行的程序 sta...

仗劍走天涯 2207

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux内核学习——2. 原子操作

原子操作 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链 目录 原子操作2、原子操作2.1 原子变量在内核中的体现2.2 原子变量的内核实现2.2.1 ATOMIC_OPS 在 UP 系统中的实现2.2.2 ATOMIC_OPS 在 SMP 系统中的实现2.3 原子位在内核中的体现2.4 原子位在内核中的实现2.4.1 原子位在UP系统中的.

weixin_42813232的博客 1030

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【linux内核--原子操作介绍】

`atomic_cmpxchg(atomic_t *v, int old, int new)`:比较并交换,如果`v`的当前值等于`old`,则原子地将`v`设置为`new`,并返回旧值。- `atomic_sub_and_test(int i, atomic_t *v)`:原子地从`v`中减去`i`,并测试是否变为0。- `atomic_add_return(int i, atomic_t *v)`:原子地将`i`添加到`v`,并返回新的值。返回原子变量`v`的当前值,此操作也是原子性的。

MHD0815的博客 2265

linux内核原子操作的实现

所谓原子操作,就是“不可中断的一个或一系列操作”。硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只发生在指令边缘。在多处理器结构中(Symmetric Multi-Processor)就不同了,由于系统

vivi的技术博客 2万+

什么是原子操作?如何在Linux内核中使用原子操作?

上篇文章已经给大家介绍了Linux中的各种锁(Linux内核中的互斥锁、读写锁、自旋锁、信号量该如何选择?),今天这篇文章给大家介绍一下Linux中的原子操作。原子操作是指一个或多个操作,这些操作在计算机系统中是不可分割的,也就是说,如果出现问题,整个操作都将失败,而不仅仅是部分操作。原子操作通常用于多线程编程,以确保多个线程之间的操作不会发生冲突。其实读-修改-写。

让技术没有门槛 7475

Linux内核之内核同步(二)——原子操作

原子操作可以保证指令以原子的方式被执行,执行过程不会被打断。

金荣的个人技术博客 961

Linux内核之同步管理--1.原子操作

Linux内核中的原子操作是确保多处理器环境下数据一致性的重要同步机制。原子操作具有不可分割性,在执行过程中不会被中断,且高度依赖硬件架构支持。x86架构通过LOCK指令实现总线锁定,而ARM架构采用LDREX/STREX独占访问指令。Linux提供atomic_t类型和原子操作API(如atomic_inc、atomic_dec等),广泛应用于资源引用计数、并发控制和状态标志等场景。这些机制有效避免了数据竞争,是构建高效同步原语(如自旋锁)的基础,为内核资源管理提供了安全保证。

甜航一直在的博客 1237

int linux 原子操作_linux内核原子操作

1、基本概念原子操作可以保证指令以原子的方式执行,执行过程不被打断。它通过把读取和修改变量的行为包含在一个单步中执行,从而防止了竞争的发生,保证操作结果总是一致的。例如:int i=9;线程1:i++i=9 OR i=8线程2i–;i=9 OR i=8两个线程并发的执行,导致结果不确定性。原子操作的作用和信号量机制是一样,都是为了防止同时访问临界资源,保证结果的一致性。大多数硬件体系结构要么本来就...

weixin_29355333的博客 320

Linux内核并发与竞争-原子操作

原子操作就是指不能再进一步分割的操作,一般原子操作用于变量或者位操作。假如现在要对无符号整形变量 a 赋值,值为 3,对于 C 语言来讲很简单,直接就是: a=3 但是 C 语言要先编译为成汇编指令, ARM 架构不支持直接对寄存器进行读写操作,比如要借助寄存器 R0、 R1 等来完成赋值操作。假设变量 a 的地址为 0X3000000,“a=3”这一行 C语言可能会被编译为如下所示的汇编代码:

m0_74282605的博客 994

Linux内核同步机制:掌握原子操作,避免竞态陷阱

本文详细介绍了Linux内核中的原子操作及其在避免竞态条件方面的重要性。文中首先解释了为何需要原子操作,即为了提供比传统锁机制更高效的同步手段。接着展示了Linux内核提供的原子类型(`atomic_t`和`atomic64_t`)以及一系列原子操作API,如加法、减法、自增、自减等,并通过代码示例说明了如何使用这些API实现线程安全的计数器和简单的自旋锁。此外,文章还深入探讨了如何利用比较并交换(`cmpxchg`)技术来实现无锁队列,包括入队和出队的具体实现方法,并提供了相应的代码分析。

Linux内核研究者 1296

Linux内核中并发与竞争的处理方法之原子操作

Linux内核中并发与竞争的一种处理方法:原子操作

wojiaxiaohuang2014的博客 1002

js 原子级操作_Linux内核的原子操作 | Just a dream

目录1、基本概念原子操作可以保证指令以原子的方式执行,执行过程不被打断。它通过把读取和修改变量的行为包含在一个单步中执行,从而防止了竞争的发生,保证操作结果总是一致的。例如:int i=9;线程1:i++i=9 OR i=8线程2i–;i=9 OR i=8两个线程并发的执行,导致结果不确定性。原子操作的作用和信号量机制是一样,都是为了防止同时访问临界资源,保证结果的一致性。大多数硬件体系结构要么本...

weixin_36378347的博客 165
上一篇: Nginx 战斗准备 —— 优化指南
下一篇: Linux服务器时间相关结构体和函数整理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值