15、内存屏障与高效并发

1、硬件知识缓存:断电丢失数据

缓存包括:cpu缓存、内存、显存、磁盘缓存、硬盘缓存;cpu缓存又分一级缓存和二级缓存。

一般讲的高速缓存就是cpu缓存;

i5 cpu速度 3.2GHz= 3.2G/S   

2000   ddr3 = 2G/S   

硬盘   SATA2接口 300M/S             

USB3.0 80M/S       

        高速缓存很好的处理了cpu与内存的速度差异,但也为系统增加了复杂度,缓存一致性(cache coherence),在多核cpu系统中,每个cpu都有自己的高速缓存,他们共享一个主内存(main memory),当多个cpu的任务在主内存的同一区域时,可能各自的缓存数据不一致;

        解决一致性问题,各个cpu缓存访问内存时遵循的一些协议:

        MSI(modified,shared,invalid)

        MESI(Modified Exclusive Shared Or Invalid)  Exclusive独享

        MOSI、Synapse、Firefly、Dragon Protocol等。


       cpu会对输入代码进行乱序执行优化(Out-Of-Order Execution),处理器在计算之后将乱序的结果重组,保证结果与顺序执行的结果一致,不保证程序中的各个语句计算的先后顺序与输入代码顺序一致---->一个计算任务依赖另外一个计算任务的结果,代码的顺序执行就不能保证输出结果。

       jvm的JIT也有类似的指令重排序(Insturction Reorder)优化。 

2、jvm内存模型(java memory model ,JMM

        JMM用来解决各种硬件和操作系统的内存访问差异,主要目标是定义程序中的各个变量的访问规则,即将变量存储内存中和从内存中取出变量 的这种底层细节;JMM指的变量是共享变量即实例字段、静态变量、数组对象不包括线程私有变量(方法参数、局部变量);JMM将变量存储在jvm主内存中(与物理内存工作模式类似),每个线程有自己的工作内存(与物理cpu缓存类似),工作内存是主内存的变量副本,线程对变量的所有操作都必须在工作区中进行,而不能直接读取主内存中的变量,且线程的工作内存是私有的,线程之间变量值的传递需要主内存来完成。

 同cpu缓存与内存之间协议一样。JMM也存在交互协议 ,

JMM定义8种操作来实现主内存与工作内存之间的交互:

lock       作用于 主内存      将一个变量设置为 只能由一条线程独占

unlock   作用于 主内存      把一个处于锁定的变量释放供其他线程使用

read      作用于 主内存      从主内存中读取出来(一次)没完成存放

load      作用于 工作内存    将读取出来的变量放入工作内存中(副本)   

use       作用于 工作内存    把工作内存中变量传递给执行引擎(多次)

assign   作用于 工作内存    把执行引擎的结果赋值给工作内存中的变量

store     作用于 工作内存    把工作内存中的变量值交给主内存中()没完成存放

write      作用于 主内存      把store交递的变量存放在主内存中

JMM只规定read、load和store、write之间一定按顺序执行,而不一定连续执行,即中间可以插入其他语句;

 

3、volatile变量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、硬件知识缓存:断电丢失数据

缓存包括:cpu缓存、内存、显存、磁盘缓存、硬盘缓存;cpu缓存又分一级缓存和二级缓存。

一般讲的高速缓存就是cpu缓存;

i5 cpu速度 3.2GHz= 3.2G/S   

2000   ddr3 = 2G/S   

硬盘   SATA2接口 300M/S             

USB3.0 80M/S       

        高速缓存很好的处理了cpu与内存的速度差异,但也为系统增加了复杂度,缓存一致性(cache coherence),在多核cpu系统中,每个cpu都有自己的高速缓存,他们共享一个主内存(main memory),当多个cpu的任务在主内存的同一区域时,可能各自的缓存数据不一致;

        解决一致性问题,各个cpu缓存访问内存时遵循的一些协议:

        MSI(modified,shared,invalid)

        MESI(Modified Exclusive Shared Or Invalid)  Exclusive独享

        MOSI、Synapse、Firefly、Dragon Protocol等。


       cpu会对输入代码进行乱序执行优化(Out-Of-Order Execution),处理器在计算之后将乱序的结果重组,保证结果与顺序执行的结果一致,不保证程序中的各个语句计算的先后顺序与输入代码顺序一致---->一个计算任务依赖另外一个计算任务的结果,代码的顺序执行就不能保证输出结果。

       jvm的JIT也有类似的指令重排序(Insturction Reorder)优化。 

2、jvm内存模型(java memory model ,JMM

        JMM用来解决各种硬件和操作系统的内存访问差异,主要目标是定义程序中的各个变量的访问规则,即将变量存储内存中和从内存中取出变量 的这种底层细节;JMM指的变量是共享变量即实例字段、静态变量、数组对象不包括线程私有变量(方法参数、局部变量);JMM将变量存储在jvm主内存中(与物理内存工作模式类似),每个线程有自己的工作内存(与物理cpu缓存类似),工作内存是主内存的变量副本,线程对变量的所有操作都必须在工作区中进行,而不能直接读取主内存中的变量,且线程的工作内存是私有的,线程之间变量值的传递需要主内存来完成。  同cpu缓存与内存之间协议一样。JMM也存在交互协议 ,

JMM定义8种操作来实现主内存与工作内存之间的交互:

lock       作用于 主内存      将一个变量设置为 只能由一条线程独占 unlock   作用于 主内存      把一个处于锁定的变量释放供其他线程使用 read      作用于 主内存      从主内存中读取出来(一次)没完成存放 load      作用于 工作内存    将读取出来的变量放入工作内存中(副本)    use       作用于 工作内存    把工作内存中变量传递给执行引擎(多次) assign   作用于 工作内存    把执行引擎的结果赋值给工作内存中的变量 store     作用于 工作内存    把工作内存中的变量值交给主内存中()没完成存放 write      作用于 主内存      把store交递的变量存放在主内存中 JMM只规定read、load和store、write之间一定按顺序执行,而不一定连续执行,即中间可以插入其他语句;   3、volatile变量                                            

猜你喜欢

转载自nickfover.iteye.com/blog/2148021