一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
内存模型JMM
为什么是这种结构
由于CPU的速度快,内存的速度慢。因此CPU需要建立缓存机制来平衡内存的速度。
内存模型的三大特性
可见性
原子性
有序性(指令重排)
缓存一致性原理
缓存锁通过MESI实现缓存一致性,MESI通过内存屏障保证指令的前后顺序
当LOCK修改变量写回主存时,需要发送失效的消息给其他CPU,然后等待确认回执.这期间通过等待来保证指令的前后顺序.
通过内存屏障从底层来实现指令前后顺序.
缓存一致性原则在遇到LOCK指令(volatile)时会实现强制一致性
基本介绍
所有内存的传输都发生在一条共享的总线上.
总线锁定:早期的CPU中,碰到LOCK指令,会锁住总线,即当一个CPU操作时,其他CPU都阻塞,该CPU独享主存,但是开销太大
缓存锁定:现代的CPU采用缓存锁定方式。
MESI是代表了缓存数据的四种状态的首字母,分别是
- Modified :被修改的 。 只在本CPU中有缓存,并且被修改
- Exclusive:独享的 。 只在本CPU中有缓存,但是没有修改,与主存一致
- Shared: 共享的 。 在多个CPU缓存中都存在且与主存一致
- Invalid: 失效 。 要么CPU缓存中不存在,要么已经过时
嗅探机制
CPU会不停嗅探在总线上的数据交换,当一个缓存代表CPU去读取或者写入主存时,其他CPU都会知道
对上面四种状态的修改会被嗅探到并进行处理。
- 处于Modified状态时,如果有其他CPU想要读取该值。在此操作前将其缓存写回主存中,并将其他CPU的缓存置为I
- 处于Exclusive状态时,其他CPU读取该值,把缓存行状态设置为Shared
- 处于Shared状态时,当有其他CPU修改了该值(它的状态变成了M),将自己的缓存设置为Invalid