热点文章
初中毕业学什么技术工资最高?低学
初中生学什么技术好?有适合初中生
可以选择的android培训项目有哪
Android图形子系统详解
就业较难的专业主要有哪些?
现在做什么工作比较好?做什么工作
网络远程继续教育怎么样?
初中毕业能当兵吗?
.net应该怎么学习?.net学习有没有
在电脑上怎么学设计呢?一般人能学
乘车路线
乘坐6,966,k906等公交车到文化路双铺路站下车即可
咨询电话
招生咨询电话:0371-63383521 0371-63383522
学校地址:郑州市文化路90号河南财经政法大学文南1号楼
网络工程师专业 您当前所在的位置是:首页 > 专业介绍 > 网络工程师专业
新乡电脑学校详解什么是伪共享
发布时间:2019-07-09 10:14:38   作者:河南翔天信鸽学校  来源:新乡计算机学院

       缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32--256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如 果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。
       缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有 人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。
       为了让可伸缩性与线程数呈线性关系,就必须确保不会有两个线程往同一个变量或缓存行中写。两个线程写同一个变量可以在代码中发现。为了确定互相独立的变量 是否共享了同一个缓存行,就需要了解内存布局,或找个工具告诉我们。Intel VTune就是这样一个分析工具。本文中我将解释Java对象的内存布局以及我们该如何填充缓存行以避免伪共享。
       图1说明了伪共享的问题。在核心1上运行的线程想更新变量X,同时核心2上的线程想要更新变量Y。不幸的是,这两个变量在同一个缓存行中。每个线程都要去 竞争缓存行的所有权来更新变量。如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。当核心2获得了所有权然后执行更新操作,核心1就要 使自己对应的缓存行失效。这会来来回回的经过L3缓存,大大影响了性能。如果互相竞争的核心位于不同的插槽,就要额外横跨插槽连接,问题可能更加严重。
       Java内存布局(Java Memory Layout)
       对于HotSpot JVM,所有对象都有两个字长的对象头。第一个字是由24位哈希码和8位标志位(如锁的状态或作为锁对象)组成的Mark Word。第二个字是对象所属类的引用。如果是数组对象还需要一个额外的字来存储数组的长度。每个对象的起始地址都对齐于8字节以提高性能。因此当封装对 象的时候为了高效率,对象字段声明的顺序会被重排序成下列基于字节大小的顺序:
       1.doubles (8) 和 longs (8)
       2.ints (4) 和 floats (4)
       3.shorts (2) 和 chars (2)
       4.booleans (1) 和 bytes (1)
       5.references (4/8)
       6.<子类字段重复上述顺序>
       了解这些之后就可以在任意字段间用7个long来填充缓存行。在Disruptor里我们对RingBuffer的cursor和BatchEventProcessor的序列进行了缓存行填充。
       为了展示其性能影响,我们启动几个线程,每个都更新它自己独立的计数器。计数器是volatile long类型的,所以其它线程能看到它们的进展。
       从不断上升的测试所需时间中能够明显看出伪共享的影响。没有缓存行竞争时,我们几近达到了随着线程数的线性扩展。
       这并不是个完美的测试,因为我们不能确定这些VolatileLong会布局在内存的什么位置。它们是独立的对象。但是经验告诉我们同一时间分配的对象趋向集中于一块。
       所以你也看到了,伪共享可能是无声的性能杀手。

Copyright @2023 新乡计算机学校-河南翔天信鸽培训学校-河南北大青鸟 All Rights Reserved 版权所有
学校招生咨询电话:15225191462