热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是x86CMPXCHG原子,如果是这样,为什么需要LOCK?

如何解决《是x86CMPXCHG原子,如果是这样,为什么需要LOCK?》经验,为你挑选了2个好方法。

在Intel的文档称

该指令可以与LOCK前缀一起使用,以允许指令以原子方式执行.

我的问题是

    可以CMPXCHG用内存地址操作吗?从文档看来似乎没有,但任何人都可以确认只能在寄存器中使用实际的VALUE,而不是内存地址吗?

    如果CMPXCHG不是原子级和高级语言级CAS必须通过LOCK CMPXCHG(带LOCK前缀)来实现,那么引入这样一条指令的目的是什么?

Peter Cordes.. 23

这似乎是你真正要求的一部分:

为什么不使用内存操作数lock隐含前缀cmpxchg,就像它一样xchg

简单的答案(其他人给出的)就是英特尔以这种方式设计它.但这导致了一个问题:

为什么英特尔这样做?是否有一个用例的cmpxchglock

在单CPU系统上,相对于其他线程或在同一CPU内核上运行的任何其他代码cmpxchg 原子的.(但不是"系统"观察者,如内存映射I/O设备,或者是正常内存的DMA读取设备,因此lock cmpxchg即使在单处理器CPU设计上也是如此).

上下文切换只能发生在中断上,中断发生在指令之前或之后,而不是在中间.在同一CPU上运行的任何代码都会将其cmpxchg视为完全执行或根本不执行.


例如,Linux内核通常使用SMP支持进行编译,因此它lock cmpxchg用于原子CAS.但是当在单处理器系统上启动时,它会将lock前缀修补到nop代码内联的任何地方,因为nop cmpxchg运行速度比快lock cmpxchg.有关更多信息,请参阅此LWN有关Linux的"SMP替代"系统的文章.它甚至可以lock在热插拔第二个CPU之前修补回前缀.

在这个答案中阅读更多关于单处理器系统上单个指令的原子性的信息,并在@ supercat的答案+注释中可以num++是原子的int num.请参阅我的答案,了解有关原子性如何实现/为读 - 修改 - 写指令实现的大量详细信息lock cmpxchg.


(同样的推理也适用于cmpxchg8b/ cmpxchg16b,并且xadd通常仅用于同步/原子操作,而不是使单线程代码运行得更快.显然,内存目的地add [mem], reglock add [mem], reg案例之外是有用的.)



1> Peter Cordes..:

这似乎是你真正要求的一部分:

为什么不使用内存操作数lock隐含前缀cmpxchg,就像它一样xchg

简单的答案(其他人给出的)就是英特尔以这种方式设计它.但这导致了一个问题:

为什么英特尔这样做?是否有一个用例的cmpxchglock

在单CPU系统上,相对于其他线程或在同一CPU内核上运行的任何其他代码cmpxchg 原子的.(但不是"系统"观察者,如内存映射I/O设备,或者是正常内存的DMA读取设备,因此lock cmpxchg即使在单处理器CPU设计上也是如此).

上下文切换只能发生在中断上,中断发生在指令之前或之后,而不是在中间.在同一CPU上运行的任何代码都会将其cmpxchg视为完全执行或根本不执行.


例如,Linux内核通常使用SMP支持进行编译,因此它lock cmpxchg用于原子CAS.但是当在单处理器系统上启动时,它会将lock前缀修补到nop代码内联的任何地方,因为nop cmpxchg运行速度比快lock cmpxchg.有关更多信息,请参阅此LWN有关Linux的"SMP替代"系统的文章.它甚至可以lock在热插拔第二个CPU之前修补回前缀.

在这个答案中阅读更多关于单处理器系统上单个指令的原子性的信息,并在@ supercat的答案+注释中可以num++是原子的int num.请参阅我的答案,了解有关原子性如何实现/为读 - 修改 - 写指令实现的大量详细信息lock cmpxchg.


(同样的推理也适用于cmpxchg8b/ cmpxchg16b,并且xadd通常仅用于同步/原子操作,而不是使单线程代码运行得更快.显然,内存目的地add [mem], reglock add [mem], reg案例之外是有用的.)



2> Holger..:

您正在将高级锁与正好命名的低级CPU功能混合在一起LOCK.

无锁算法试图避免的高级锁可以保护执行可能需要任意时间的任意代码片段,因此,这些锁必须将线程置于等待状态,直到锁可用,这是一项代价高昂的操作,例如暗示维护等待线程的队列.

这与CPU LOCK前缀功能完全不同,后者仅保护单个指令,因此可能仅在该单个指令的持续时间内保留其他线程.由于这是由CPU本身实现的,因此不需要额外的软件工作.

因此,开发无锁算法的挑战并不是完全消除同步,它归结为将代码的关键部分减少到由CPU本身提供的单个原子操作.


@Peter Cordes:OP的实际问题在[本评论]中显而易见(/sf/ask/17360801/?noredirect=1#comment44084729_27837731).在OP承认高级锁和指令前缀之间的混淆是实际问题后,我才发布了答案.您的添加对于将来的读者在搜索"锁定前缀"后找到此问题仍然有价值.
@Rohit Sachan:您可以说它拥有BUS锁,但是由于它对每个内存访问都有效,所以唯一的区别在于,它是为一条指令进行的两次内存访问而持有的,更重要的是,它在交谈时只会造成混乱关于“无锁编程”。换句话说,您应该始终关心讨论是关于硬件还是软件体系结构……
我认为OP部分地问"没有'锁定'的'cmpxchg`有什么意义?".请参阅[我的回答](/sf/ask/17360801/#44273130):英特尔以这种方式设计它,因为它在单处理器系统上很有用.
推荐阅读
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 高效重装Windows 10系统指南
    如何快速地为您的电脑重装Windows 10系统?本文将详细介绍从下载系统镜像到安装完成的每一步操作。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 本文介绍了在 iOS 开发中设置图片和视图圆角的几种方法,包括通过 layer 设置圆角、使用贝塞尔曲线和 Core Graphics 框架,以及使用 CAShapeLayer 和 UIBezierPath。每种方法都有其优缺点,适用于不同的场景。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 华为捐赠欧拉操作系统,承诺不推商用版
    华为近日宣布将欧拉开源操作系统捐赠给开放原子开源基金会,并承诺不会推出欧拉的商用发行版。此举旨在推动欧拉和鸿蒙操作系统的全场景融合与生态发展。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统
    本文详细介绍了在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统的步骤。首先,通过“文件”菜单选择“新建虚拟机”并进入自定义设置。接着,在硬盘兼容性选项中选择默认设置。为了更好地进行Linux操作系统的安装练习,建议选择稍后安装操作系统,并在虚拟机安装完成后,根据实际需求删除不必要的硬件组件。此外,本文还提供了详细的配置参数和注意事项,帮助用户顺利完成整个部署过程。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼错误72error:ErroropeningoutputfileC:Users林鑫辰AppDataLocalTemptmpxft_0000 ... [详细]
  • [oracle@oracle~]$impxxxx/userfile=/usr/local/src/666.dmpfull=ybuffer=40960000Import: ... [详细]
author-avatar
梦幻小螳螂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有