美文网首页
【Java】一文全面了解伪共享(false sharing)问题

【Java】一文全面了解伪共享(false sharing)问题

作者: 小北觅 | 来源:发表于2022-05-05 00:03 被阅读0次

通过本文,可以收获如下知识:
① MESI协议相关
② 图例讲解伪共享问题
③ 实例讲解伪共享问题带来的性能问题
④ 使用perf进行性能分析
⑤ @Contended注解的原理

一、概述

在本文中,我们会看到伪共享问题有时会使多线程程序适得其反。

首先,我们将从缓存和局部性理论开始。然后我们会自己重写一个LongAdder并发工具类,并将其与java.util.concurrent中的实现进行基准测试。在本文中,我们将使用基准测试的结果来调研伪共享对程序性能的影响。

本文中与java相关的部分很大程度上依赖于对象的内存布局。由于这些布局细节不是JVM规范的一部分,由实现者自行决定,因此我们将只关注一个特定的JVM实现:HotSpot JVM。在本文中,JVM和HotSpot JVM术语也可以互换使用。

二、缓存行(Cache Line) 和 一致性(Coherency)

处理器会使用不同级别的缓存——当处理器从主存读取一个值时,它可能缓存该值以提高性能。

事实证明,大多数现代处理器不仅缓存了请求的值,还缓存了一些这个请求的值的附近的值。这种优化基于空间局部性的思想,可以显著提高应用程序的整体性能。简单地说,处理器缓存是根据cache line工作的,而不是单个可缓存值。

当多个处理器在相同或附近的内存位置上运行时,它们可能最终共享相同的缓存线。在这种情况下,保持不同核心中的重叠缓存彼此一致是很重要的。保持这种一致性的行为称为缓存一致性。

有相当多的协议来维护CPU核之间的缓存一致性。在本文中,我们将讨论MESI协议。

2.1 MESI协议

在MESI协议中,每条cache line可以处于以下四种不同的状态之一:Modified, Exclusive, Shared, Invalid。MESI是这些状态的首字母缩写。

为了更好地理解这个协议是如何工作的,让我们来看一个示例。假设两个核要从附近的内存位置读取数据:

相关文章

  • 【Java】一文全面了解伪共享(false sharing)问题

    通过本文,可以收获如下知识:① MESI协议相关② 图例讲解伪共享问题③ 实例讲解伪共享问题带来的性能问题④ 使用...

  • 伪共享-false sharing

    伪共享1. cpu与主存之间的缓存速度:1级缓存>2级缓存>3级缓存>主存2. 缓存以行为单位,每行2的幂次方个字...

  • 伪共享(false sharing)

    背景: 在对称多处理器(SMP)系统中,每个处理器都有各自的本地cache(local cache)。内存系统必须...

  • Java中的伪共享(false sharing)

    维基百科中对伪共享的定义如下: 其大致意思是:CPU的缓存是以缓存行(cache line)为单位进行缓存的,当多...

  • 伪共享

    转载于 杂谈 什么是伪共享(false sharing)?[https://www.cnblogs.com/ton...

  • 伪共享(false sharing)详解

    一、什么是伪共享 CPU缓存系统中是以缓存行(cache line)为单位存储的。目前主流的CPU Cache的C...

  • 杂谈 什么是伪共享(false sharing)?

    问题 (1)什么是 CPU 缓存行? (2)什么是内存屏障? (3)什么是伪共享? (4)如何避免伪共享? CPU...

  • 杂谈 什么是伪共享(false sharing)?

    问题 (1)什么是 CPU 缓存行? (2)什么是内存屏障? (3)什么是伪共享? (4)如何避免伪共享? CPU...

  • @Contended

    表示被注解的类或/字段可能存在内存竞争,通常采用伪共享(false sharing)。此注释用作提示,此类对象和字...

  • 伪共享(False Sharing)和缓存行(Cache Lin

    前言 在上篇介绍LongAdder的文章中,我们最后留下了一个问题,为什么Cell中要插入很多个实际上并没有使用的...

网友评论

      本文标题:【Java】一文全面了解伪共享(false sharing)问题

      本文链接:https://www.haomeiwen.com/subject/qqqnyrtx.html