您当前的位置:首页 >> 家居优品

CPU 伪共享是如何发生的?又该如何可能会?

2024-01-22 12:18:48

况下,另外由于 1 号当前的 Cache 也有此相同的信息,且情况下为「已修订」情况下,所以要先把 1 号当前的 Cache 对应的 Cache Line 写重返磁盘,然后 2 号当前再从磁盘磁盘 Cache Line 不等的信息到 Cache 当中,就此把函数 B 修订到 2 号当前的 Cache 当中,并将情况下标示为「已修订」情况下。

所以,可以找到如果 1 号和 2 号 CPU 当前这样不间断更替的分别修订函数 A 和 B,就不会减法 ④ 和 ⑤ 这两个步骤,Cache 并没有人不可忽视多多线程的效果,虽然函数 A 和 B 两者之间其实并没有人任何的的关系,但是因为同时归属于一个 Cache Line ,这个 Cache Line 当中的任意信息被修订后,都不会相互影响,从而出现 ④ 和 ⑤ 这两个步骤。

因此,当多多线程修订互相独立的函数时,如果这些函数对等同一个多多线程行,就不会无意当中影响彼此的持续性能,这就是实为对等。

如何尽量避免举个栗子public class FalseSharingTest { public static void main(String[] args) throws InterruptedException { testPointer(new Pointer()); } private static void testPointer(Pointer pointer) throws InterruptedException { long start = System.currentTimeMillis(); Thread t1 = new Thread(() -> { for (int i = 0; i < 100000000; i++) { pointer.x++; } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 100000000; i++) { pointer.y++; } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(System.currentTimeMillis() - start); System.out.println(pointer); }} class Pointer { volatile long x; volatile long y;}

后面这个例子,我们声明了一个Pointer的类,它还包括了x和y两个函数(需声明为volatile,保证可见持续性),一个多线程对x进行时自增1亿次,一个多线程对y进行时自增1亿次。

可以看到,x和y显然没有人任何的关系,但是更新x的时候不会把其它还包括x的多多线程行过载,同时y也就过载了,调试这段计算机系统驱动的间隔时间为3890ms。

实为对等的原理我们知道了,一个多多线程行是64二进制,一个long特性是8个二进制,所以尽量避免实为对等也很简单,大约有以下三种模式:

(1)在两个Long特性的函数两者之间即使如此7个long特性

我们把后面的pointer去掉上头这个结构

class Pointer { volatile long x; long p1, p2, p3, p4, p5, p6, p7; volatile long y;}

再次调试计算机系统,不会找到驱动间隔时间神奇的缩短为695ms

(2)新的创建自己的long特性,而不是Ja自带的long修订Pointer如下

class Pointer { MyLong x = new MyLong(); MyLong y = new MyLong();} class MyLong { volatile long value; long p1, p2, p3, p4, p5, p6, p7;}

同时把pointer.x++改为pointer.x.value++;等,再次调试计算机系统找到间隔时间是724ms,这样本质上还是缓冲。所以,尽量避免 Cache 实为对等实际上是用空间换间隔时间的哲学思想,浪费一部分 Cache 空间,从而换来持续性能的提升。

(3)运用于@sun.misc.Contended梗概(ja8)

修订MyLong如下:

@sun.misc.Contendedclass MyLong { volatile long value;}

匹配运用于这个梗概是无效的,必须在JVM启动变量加上-XX:-RestrictContended才不会生效,再次调试计算机系统找到间隔时间是718ms。注意,以上三种模式当中的前两种是通过加字段的形式实现的,加的字段又没有人地方运用于,可能不会被jvm冗余掉,所以劝告运用于第三种模式。 Ja 并发前提 Disruptor 运用于「二进制缓冲 + 继承」的模式,来尽量避免实为对等的难题。感兴趣的同学可以自己去修习了解一下。

新必奇蒙脱石散和妈咪爱的作用一样吗
空调病吃什么药?
新冠嗓子疼多久消失
治疗新冠的药有哪几种药
闹肚子吃肠炎宁行吗
相关阅读
友情链接