目录
- CPU内存模型
- CPU执行乱序原因
- cpu 内存屏障
- 作用
- 分类
- JMM内存屏障
- 作用
- 分类
1. CPU内存模型
2. CPU执行乱序原因
由于在多CPU的机器上,每个CPU都存在cache,当一个特定数据第一次被特定一个CPU获取时,由于在该CPU缓存中不存在,就会从内存中去获取,被加载到CPU高速缓存中后就能从缓存中快速访问。当某个CPU进行写操作时,它必须确保其他的CPU已经将这个数据从他们的缓存中移除,这样才能让其他CPU安全的修改数据。显然,存在多个cache时,我们必须通过一个cache一致性协议来避免数据不一致的问题,而这个通讯的过程就可能导致乱序访问的问题,也就是运行时的内存乱序访问
3. cpu 内存屏障
3.1 作用
解决CPU的执行乱序、保证数据的可见性,不能解决缓存一致性问题
3.2 分类
屏障名称 | 作用 |
---|---|
写屏障(store barrier) | 所有在storestore内存屏障之前的所有执行,都要在该内存屏障之前执行,并发送缓存失效的信号 所有在storestore barrier指令之后的store指令,都必须在storestore barrier屏障之前的指令执行完后再被执行 |
读屏障(load barrier) | 所有在loadbarrier读屏障之后的load指令,都在loadbarrier屏障之后执行 |
全屏障(Full Barrier) | 所有在storeload barrier之前的store/load指令,都在该屏障之前被执行 所有在该屏障之后的的store/load指令,都在该屏障之后被执行 |
4. JMM内存屏障
4.1 作用
同上
4.2 分类
屏障分类 | 指令示例 | 说明 |
---|---|---|
LoadLoad Barriers | load1 ; LoadLoad; load2 | 确保load1数据的装载优先于load2及所有后续装载指令的装载 |
StoreStore Barriers | stroe1 ; storestore; store2 | 确保store1数据对其他处理器可见优先于store2及所有后续存储指令的存储 |
LoadStore Barriers | load1 ; LoadStore; Store | 确保load1数据装载优先于store2以及后续的存储指令刷新到内存 |
StoreLoad Barriers | Store1 ; StoreLoad; load2 | 确保store1数据对其他处理器变得可见, 优先于load2及所有后续装载指令的装载 |