怎样做视频电影网站,做什么网站吸引人,企业网站建设相关书籍在线阅读,杭州seo软件上节提到的#xff1a;伪共享#xff0c;今天我们来说说。那什么是伪共享呢#xff1f;这得从CPU的缓存结构说起。以下如图#xff0c;CPU一般来说是有三级缓存#xff0c;1 级#xff0c;2级#xff0c;3级#xff0c;越上面的#xff0c;越靠近CPU的#xff0c;速度…上节提到的伪共享今天我们来说说。那什么是伪共享呢这得从CPU的缓存结构说起。以下如图CPU一般来说是有三级缓存1 级2级3级越上面的越靠近CPU的速度越快成本也越高。也就是说速度方面1级2级3级。图1图2如上图2我们来看看不同级别的缓存的时延到CPU的延迟CPU时钟耗时主内存很多(Multiple)~60-80 nsL3 缓存~40-45 周期~15 nsL2 缓存~10 周期~3 nsL1 缓存~3-4 周期~1 ns寄存器一周期小于1ns飞快更多CPU架构信息https://blog.csdn.net/karamos/article/details/80126704说到这里我们要理解一个很重要的概念缓存行。什么是缓存行首先我们来看这几级缓存其中12级缓存是CPU核心私有的也就是说每个核之间不会共享12级缓存那它们之间怎么通信或共享数据呢答案是3级缓存如下图那core1,和core2之间是通过什么方式共享缓存呢答案是缓存行!什么是缓存行简单来说就是CPU内核之间共享数据的最小单位。如下图x,y是在同一个缓存行那每次CPU内核之间通信时交换x,y值可以同时共享两个值。是不是很高效是的一般情况下如果x,y是属于数组内的数据 是可以达到高效共享数据的功能但问题又来了如果x,y并不属于同一数组x属于core1,而y属于core2这个时候如果core1更新了x,会导致y值失效了。为什么失效了因为他们在同一缓存行。这时只有把缓存行 flush到主存后, 其他内核中的相应的缓存行才会被置为过期数据,而缓存行什么时候flush到memory, 这个是有一定延时的 ,在这个延时当中, 其他CPU core是无法得知你的更新的 。那么内核core2再去读取Y的值时由于L1的缓存里的数据已失效那么就需要从L3获取然后放入L2再放入L1。 这样核心2读取Y值就需要从L3级的缓存读了。但是明明是内核core1修改的X的值却影响到内核2去读取Y值了。同理如果是内核2去修改Y的值也会影响内核1去读取X的值。简单来说x,y同放在缓存行而且它们又属于不同CPU内核的数据值(事实上CPU内核也就是代码中的线程)。那就会因为各自更新其中一个值而导致缓存失效。这就是著名的伪共享问题。有没有什么解决方案呢有的。方案是缓存行填充。还是回到上面的例子如果x,y同放到同一个缓存行会造成伪共享。很简单那就不要放在一起好了比如x有8byte(字节),而一般缓存行总共有64byte。那其他剩下的位置我们就用预定的空变量填充就行了代码如下 (java6版本)public final static classVolatileLong {public volatile long x 0L;public long p1, p2, p3, p4, p5, p6,p7;//缓存行填充}这个时候core1更新x值也就不会影响y值从而造成伪共享问题。上面的代码是java6的解决方案。JAVA 8下的方案在JAVA 8中缓存行填充终于被JAVA原生支持了。JAVA 8中添加了一个Contended的注解添加这个的注解将会在自动进行缓存行填充如下代码import sun.misc.Contended;Contendedpublic class VolatileLong {public volatile long value 0L;}执行时必须加上虚拟机参数-XX:-RestrictContendedContended注释才会生效。很多文章把这个漏掉了那样的话实际上就没有起作用。这就是伪共享的解决方案多么简单本系列完毕如果各位读者还有什么意见或建议欢迎拍砖吐槽