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

缓存操作是原子的吗?

如何解决《缓存操作是原子的吗?》经验,为你挑选了1个好方法。

我正在学习有关CPU高速缓存的信息,但是现在我仍然对高速缓存一致性协议(MESI)有误解。想象一下,我们有2个内核在共享状态下有一条缓存行。其中一个执行读取,另一个执行写入:

 ;mem is cached in Shared state
 Thread 1 (core 1)          Thread 2 (core 2)
  mov rax, [mem]            mov [mem], dword 1

核心1可以观察到某些中间状态。我的意思是这样的:

    Core 2将缓存行标记L1D为已修改,并将更改写入其中。

    高速缓存行core 1L1D高速缓存仍处于Shared状态,所以读恰好读取陈旧的价值。

    读取过时的值之后,已经将core 1L1D缓存中的行标记为无效。

英特尔的MESI / MESIF实施中是否可能出现这种情况?



1> Peter Cordes..:

核心1的L1D缓存中的缓存行仍处于Shared状态

这是违反MESI的方案的一部分。在核心2发送的RFO完成之前,存储无法提交,因此核心1的行处于无效状态。

但是,在您的示例中,这实际上不是“中间”步骤。如果没有同步,则无法通过将核心1的负载简单地在线路无效之前发生来区分您不可能的情况。也就是说,核心1的负载可以按全局顺序出现在核心2的存储之前。

直到在本地执行存储之后(它们必须退出,然后存储队列才能将它们提交到L1D),这些存储才成为全局可见的,并且x86的内存模型允许StoreLoad重新排序,因此可以延迟存储(保留隐藏在私有存储中)队列),直到以后核心2的负载变得全局可见。(有关内存重新排序以及StoreLoad重新排序的含义的更多信息,请参阅Jeff Preshing的“ 内存障碍就像源代码控制操作 ”。)


在MESI(以及所有类似MESIF或MOESI的变体)中,如果一个缓存的行处于E或M状态,则其他缓存都不能拥有该行的副本。MESI维基百科文章中的状态表清楚地表明了这一点:如果一个缓存具有E或M状态,则其他缓存都具有Invalid状态。

两个缓存都不可能都具有一行具有不同数据的有效副本。这就是缓存保持一致的含义,而阻止这种情况的发生是MESI协议的重点。

如果某个核心想要修改一个缓存行,它将获得该行的独占所有权,因此其他任何核心都无法观察到过时的值。这必须商店可以提交到L1D 之前进行。存在存储队列以隐藏所有权读取的延迟(除其他事项外),但是存储队列中的数据尚未提交给L1D。(相关:当不同的CPU内核不同步地写入同一RAM地址时会发生什么?有关存储队列的更多信息)。


顺便说一句,顺便说一句,假设它[mem]是自然对齐的,因此对其的加载/存储是原子的(由x86架构保证)。 为什么在x86上对自然对齐的可变原子进行整数赋值?。


多级缓存和修改的行

使用多级缓存,脏的缓存行可以在层次结构中传播。因此,在同一核心的 L1D和L2中一条线可以处于修改状态。这很好,因为从L1D进行写回通过L2。

据我了解,英特尔CPU中包含共享的三级高速缓存无需先回写DRAM,即可将高速缓存行的副本共享给多个内核。因此,就普通/简单的MESI而言,将L3视为后备存储,而不是DRAM。

在多路插座系统上进行这项工作很棘手。我不确定是否已进行设置,因此套接字中的L3只能缓存与该套接字所连接的DRAM对应的物理地址。无论如何,侦听请求都会在L3缓存未命中的套接字之间发送,并且您可以配置许多复杂的设置来在Xeon系统上进行调整。(例如,请参阅有关Haswell Xeon的Anandtech文章。)


推荐阅读
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
秋日里的一抹阳光_797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有