热门标签 | 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文章。)


推荐阅读
  • 本文通过对OkHttp源码的详细解读,旨在帮助读者理解其核心执行流程,特别是同步与异步请求的处理方式。文中不仅涵盖了基本的使用示例,还深入探讨了OkHttp的核心功能——拦截器链的工作原理。 ... [详细]
  • 深入解析线程池的工作原理与实际应用
    本文详细探讨了线程池的核心概念、工作原理及其在实际开发中的应用,包括不同类型的线程池创建方式及其适用场景。 ... [详细]
  • mybatis相关面试题 ... [详细]
  • 本文旨在探讨Linux系统中两种重要的进程间通信(IPC)机制——System V和POSIX的标准及其特性,为开发者提供深入的理解。 ... [详细]
  • 运用DDD分层架构优化微服务代码设计
    在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 应对高并发面试题:构建稳健的系统架构策略
    本文探讨了如何在面试中有效地回答有关高并发系统设计的问题。通过逐步介绍从单机部署到集群化、数据库优化、缓存应用及消息队列的使用,帮助读者建立解决高并发挑战的基本思路。 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 深入解析达内Java基础练习题
    本文精选了几道典型的Java基础题目,旨在帮助学习者巩固基础知识,提升编程技能。通过这些题目,你可以检验自己的Java基础掌握程度。 ... [详细]
  • 计算机视觉初学者指南:如何顺利入门
    本文旨在为计算机视觉领域的初学者提供一套全面的入门指南,涵盖基础知识、技术工具、学习资源等方面,帮助读者快速掌握计算机视觉的核心概念和技术。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文介绍了Linux内核中TCP的三种接收队列:Prequeue、sk_receive_queue和Backlog。这些队列在数据包处理过程中扮演着重要角色,帮助提高系统性能和效率。 ... [详细]
  • 我正在Windows的汇编器Intelx86(对于NASM)中编写Playfair密码。我在数 ... [详细]
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社区 版权所有