首页 > 其他分享 >原子操作

原子操作

时间:2023-02-12 23:22:54浏览次数:31  
标签:count 原子 指令 内存 操作 处理器

概述

原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”,可以保证指令以原子的方式运行,即执行过程不被打断。

对一个整数的操作可以用原子函数,避免使用互斥锁、自旋锁等锁机制带来的线程阻塞、锁竞争、死锁、优先级反转、性能损耗等问题。

linux内核提供了一套原子操作的函数,比如

static inline int atomic_dec_and_test(atomic_t *v)

 

函数功能:减一后判断为0则返回true,否则false。这里的减一和判断是否为0为一个原子操作。

竟态问题

原子操作的提出主要是为了解决程序运行过程中的竞态问题,以程序中一个共享全局变量的自加操作count++为例,处理器完成这样一个操作需要三个步骤:

  1、从内存中读取count变量的值到寄存器中;
  2、将寄存器中的值加1;
  3、将寄存器中的值写回到内存中。
这个操作也称为RMW(Read-Modify-Write)。现在假设存在两个执行线程同时在对count(count初始值假设为0)执行自加操作,预期的结果应当是两个线程串行地完成了count的自增操作,count最终的值为2;但在并发场景下,处理器的实际执行序列却可能会是下面这个情况:

 

 

之所以会产生上面的情况,原因就是RMW操作本身不具备原子性,它可能会被中断打断或者被并行程序产生的数据竞争影响。为了解决这种问题,就需要让RMW操作成为一个原子操作,这需要硬件提供机制来保证。

 

单处理器系统下的原子操作

在单处理器(Uni-Processor)系统中,处理器的执行流程只会受到中断机制的影响,由于中断只能发生于指令之间,因此能够在单条指令中完成的操作都可以认为是“原子操作”。单处理器系统实现原子操作的方式有两种:

  1、提供能完成多步操作的单条指令:这在采用复杂指令集架构的处理器上比较常见,例如x86架构提供的inc指令就可以通过一条指令完成变量的自加操作;
  2、关中断:处理器中断关闭后,就可以不间断地执行一系列指令,等所有操作完成后再打开中断。

多处理器系统下的原子操作

在多处理器(Multi-Processor)系统中,面临的并发问题要严峻很多,由于系统中有多个处理器在独立地运行,即使是一条指令执行期间也会受到其它处理器的干扰,导致指令执行结果错误。在不同的处理器体系结构下,硬件提供的原子操作实现机制会存在区别。x86架构通过对总线加锁保证只允许一个处理器访问,ARM架构通过独占内存。

CAS原子操作

Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,采用这种无锁的原子操作可以实现线程安全,避免加锁的笨重性。

CAS操作包含三个操作数:内存位置(V)、预期原值(A)、新值(B)。

如果内存位置的值与预期原值相等,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作;最后返回内存位置的值。

CAS是实现自旋锁的基础,CAS 利用 CPU 指令保证了操作的原子性,以达到锁的效果,循环这个指令,直到成功为止。

 

标签:count,原子,指令,内存,操作,处理器
From: https://www.cnblogs.com/god-of-death/p/17114990.html

相关文章

  • linux007之文件、目录操作命令
    查看当前所在目录:pwd:查看当前所在目录路径ls:查看当前目录所有文件ls路径:查看指定目录下所有文件ls-l:以列的形式查看当前目录所有文件ls-l路......
  • .Net Core 操作PDF模板
    1.安装PdfSharpCore   2.PdfSharpCore.Pdf.PdfDocumentdoc=PdfSharpCore.Pdf.IO.PdfReader.Open(temppath,PdfDocumentOpenMode.Modify);//创建一个文档实例,t......
  • 7.5利用虚拟机获得其他操作系统环境
       即使不通过移植,也可以使用别的办法来进行其他操作系统的应用。通过利用虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。   VirtualPCfo......
  • 7.1运行环境=操作系统+硬件
       程序中包含着运行环境这一内容。可以看它的安装包或者目录。通常在某个位置会写有“运行环境”这一项。例如2007MicrosoftOfficeSystem需要的运行环境,就如表7-......
  • K8S限制不同的用户操作固定命名空间
    为用户签发证书ssl认证#进入存放ca证书的文件夹$cd/etc/kubernetes/pki/#生成私钥key$(umask077;opensslgenrsa-outhxg.key2048)#生成一个用户名为user-hxg......
  • 软件测试|程序猿必会的git操作(二)
    Git创建仓库上传代码相关操作上篇文章,我们讲了如何配置Git环境,注册Gitee账号,本篇文章我们讲解一下Fork和clone项目的操作。Fork项目在Gitee上也有部分优秀的开源项目,我们想......
  • 广点通操作流程
    新建推广计划1.计划类型:展示广告,搜索广告,2.出价方式:OCPM、OCPC、自动出价3.投放目标:商品推广(电商),应用推广,销售线索收集(微信朋友圈),网页推广(收集表单),品......
  • 学习python中的字符串操作
    字符串字符串的存储地址原理​ 在python中有一个字符串保留区,当中存放了声明的字符串,每一个字符串对应一个地址,变量名指向对应的地址,只要字符串相同,声明内容相同的字符......
  • [14] Zookeeper-集群操作
    1.集群部署1.1集群安装(1)集群规划在hadoop102、hadoop103和hadoop104三个节点上都部署Zookeeper。(2)解压安装在hadoop102解压Zookeeper安装包到/opt/module......
  • aop操作-AspectJ注解方式
    1.创建类,类中定义方法packagecom.xxx.spring.aop.aopanno;publicclassUser{publicvoidadd(){System.out.println("add...");}}2.创建增强......