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

为什么在没有LOCK前缀的情况下,MESI协议不能保证x86上CMPXCHG的原子性?

如何解决《为什么在没有LOCK前缀的情况下,MESI协议不能保证x86上CMPXCHG的原子性?》经验,为你挑选了1个好方法。

我知道,MESI协议成功地保证了不同内核的内存(缓存)视图相同。我的问题来自这样一个事实,即在写入过程中,MESI保证高速缓存由CPU独占,然后原子CMPXCHG只是原子地比较和交换值。那么,当我们已经有了MESI协议的保证时,为什么还要使用LOCK指令来锁定高速缓存行呢?



1> Peter Cordes..:

原子CMPXCHG只是原子地比较和交换值

不,缓存访问硬件不会将CMPXCHG实现为单周期固有原子操作。它是由多个oups合成的,这些oups分别加载和存储。

如果这是常规CMPXCHG的工作方式,那么您的推理将是正确的。但是常规CMPXCHG 并不是原子的(对于其他内核的观察者而言)。


lock cmpxchg解码到多个微指令,以使高速缓存行从加载到存储的位置保持“锁定”状态,将其变成单个原子事务,以使系统中的其他任何观察者都可以看到。(即,延迟响应MESI使该行无效或共享该请求,直到存储提交为止)。这也使其成为完整的内存屏障。


如果不使用lock,则CMPXCHG会解码为多个加载的uops,检查是否包含相等内容,然后根据比较结果存储或不存储新值。 就原子性而言,与相同add [mem], edx,后者使用ALU在加载和存储操作之间进行加法运算。也就是说,它不是原子的,除了关于中断的同一个内核之外(因为中断只能在指令边界发生)。

加载和存储分别是单独的原子,但是它们不是单个原子的RMW事务。 如果另一个核心使我们的缓存行副本无效并在负载和商店之间存储新值,则我们的商店将踏上其他商店。并且该其他存储将在加载和存储之间的缓存行上以全局操作顺序出现,这违反了“原子” =不可分割的定义。

num ++是否可以对“ int num”是原子的? 为什么add [mem], edx不是原子的,以及如何lock使其原子化。

x86 CMPXCHG是原子的,如果需要,为什么它需要LOCK?用例为cmpxchglock:单处理器机器。


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温Linux内核:互斥和同步相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼错误72error:ErroropeningoutputfileC:Users林鑫辰AppDataLocalTemptmpxft_0000 ... [详细]
  • 主函数:CStringGetCPUIDString()Copyright(C)shangweixiao2011 ... [详细]
  • 1引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着JavaSE1.6对Synchronized进行 ... [详细]
  • xmake-ftmpxxx.luaxmake--filexxx.lua最简单:--添加名为demo的目标到工程target(demo)--设置目标程序类型为二进制,一般为 ... [详细]
  • 我有一个vim默认安装在Linux上,在一个系统上有vt52终端仿真器和unicode功能。Vim不会接受换行一切都工作正常,直到今天,当 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 显卡驱动对游戏的影响及其提升效果的研究
    本文研究了显卡驱动对游戏体验的提升效果,通过比较新旧驱动加持下的RTX 2080Ti显卡在游戏体验上的差异。测试平台选择了i9-9900K处理器和索泰RTX 2080Ti玩家力量至尊显卡,以保证数据的准确性。研究结果表明,显卡驱动的更新确实能够带来近乎50%的性能提升,对于提升游戏体验具有重要意义。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
author-avatar
晓云71_783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有