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缓存类似),工作内存是主内存的变量副本,线程对变量的所有操作都必须在工作区中进行,而不能直接读取主内存中的变量,且线程的工作内存是私有的,线程之间变量值的传递需要主内存来完成。
JMM定义8种操作来实现主内存与工作内存之间的交互:
lock 作用于 主内存 将一个变量设置为 只能由一条线程独占
unlock 作用于 主内存 把一个处于锁定的变量释放供其他线程使用
read 作用于 主内存 从主内存中读取出来(一次)没完成存放
load 作用于 工作内存 将读取出来的变量放入工作内存中(副本)
use 作用于 工作内存 把工作内存中变量传递给执行引擎(多次)
assign 作用于 工作内存 把执行引擎的结果赋值给工作内存中的变量
store 作用于 工作内存 把工作内存中的变量值交给主内存中()没完成存放
write 作用于 主内存 把store交递的变量存放在主内存中
JMM只规定read、load和store、write之间一定按顺序执行,而不一定连续执行,即中间可以插入其他语句;
3、volatile变量
相关推荐
java内存屏障与JVM并发详解实用.pdf
内存屏障分析,内存屏障分析,内存屏障分析,内存屏障分析,内存屏障分析
Linux内存屏障知识讲解,彻底了解内存屏障
内核同步机制-优化屏障和内存屏障,linux内核。
内存屏障浅析,多线程编程,由于编译器的优化和缓存的使用,导致对内存的写入操作不能及时的反应出来,也就是说当完成对内存的写入操作之后,读取出来的可能是旧的内容
主要为大家讲解JVM内存模型|内存结构|内存屏障,他们的概念,有什么关联以及各种的功能
内存屏障是为应付内存访问操作的乱序执行而生的. 那么, 内存访问为什么会乱序呢? 这里先简要介绍一下: 现在的CPU一般采用流水线来执行指令. 一个指令的执行被分成: 取指, 译码, 访存, 执行,写回, 等若干个阶段. ...
国外的文章,比较详细的介绍了各种cpu的内存访问顺序问题
中国Linux内核开发者大会十周年演讲稿(中兴通讯谢宝友)-Linux内存屏障
内存屏障学习分享1111111
乱序执行和内存屏障
其java内存模型中更重要的,应该是内存屏障,memoryfence较粗犷,代价也提到内存屏障,先应该说到重排序,这强调下,重排序只对于那些在当前线程没有依赖关
linux内核文档<<LINUX KERNEL MEMORY BARRIERS>>的中文翻译及译注.
Linux内存屏障,CSDN 2015开发者大会上的优秀演讲
linux大神paul作品,详细介绍了并发编程的各种概念。内存屏障,mutex等。值得一读。
volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性...这篇文章主要介绍了Java多线程之volatile关键字及内存屏障,需要的朋友可以参考下
3. CPU 0 执行 b = 1,它已经在缓存行中有“b”的值了 (换句话说,缓存行已 4. CPU 0 接收到“读”消息,并且发送缓存行中的最新的“b”的值
Memory Barriers: a Hardware View for Software Hackers 讲解内存屏障的好论文,推荐!
处理器重排序与内存屏障指令 happens-before 重排序 数据依赖性 as-if-serial 语义 程序顺序规则 重排序对多线程的影响 顺序一致性 数据竞争与顺序一致性保证 顺序一致性内存模型 同步程序的顺序一致性效果 未同步...
处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序一致性保证 19 顺序一致性内存模型...