https://mp.weixin.qq.com/s/NV1ajl4Q1WqtkV8Xot349A
常见的jvm操作 load和store与我们的内存屏障 loadload ,loadstore,storeload和storestore之间的关系
首先看下MESI
在MESI协议中,每个Cache line有4种状态,分别是:
1、M(Modified) 这行数据有效,但是被修改了,和内存中的数据不一致,数据只存在于本Cache中
2、E(Exclusive) 这行数据有效,和内存中的数据一致,数据只存在于本Cache中
3、S(Shared) 这行数据有效,和内存中的数据一致,数据分布在很多Cache中
4、I(Invalid) 这行数据无效
每个Core的Cache控制器不仅知道自己的读写操作,也监听其它Cache的读写操作,假如有4个Core:
1、Core1从内存中加载了变量X,值为10,这时Core1中缓存变量X的cache line的状态是E;
2、Core2也从内存中加载了变量X,这时Core1和Core2缓存变量X的cache line状态转化成S;
3、Core3也从内存中加载了变量X,然后把X设置成了20,这时Core3中缓存变量X的cache line状态转化成M,其它Core对应的cache line变成I(无效)
CPU在cache line状态的转化期间是阻塞的,经过长时间的优化,在寄存器和L1缓存之间添加了LoadBuffer、StoreBuffer来降低阻塞时间,Buffer与L1进行数据传输时,CPU无须等待。
1、CPU执行load读数据时,把读请求放到LoadBuffer,这样就不用等待其它CPU响应,先进行下面操作,稍后再处理这个读请求的结果。
2、CPU执行store写数据时,把数据写到StoreBuffer中,待到某个适合的时间点,把StoreBuffer的数据刷到主存中。
因为StoreBuffer的存在,CPU在写数据时,真实数据并不会立即表现到内存中,所以对于其它CPU是不可见的;同样的道理,LoadBuffer中的请求也无法拿到其它CPU设置的最新数据;
因此正是因为这个buffer的存在我们才使用内存屏障保证前一步的操作执行完毕
网友评论