缓存一致性协议 mesi 和 volatile

m : modified 修改缓存

e : exlusive 独占线程

s : shared 共享排序

i : invalid 无效变量

各类状态的转换从网上摘抄一段cpu

cpu核之间通讯的消息包括读消息,以及读消息的响应消息。使无效消息,以及使无效消息的响应消息。当运行在某个cpu核的线程准备读取某个cache line的内容时,若是状态处于M,E,S,直接读取便可。若是状态处于I,则须要向其余cpu核广播读消息,在接受到其余cpu核的读响应后,更新cache line,并将状态设置为S。而当线程准备写入某个cache line时,若是处于M状态,直接写入。若是处于E状态,写入并将cache line状态改成M。若是处于S,则须要向其余cpu核广播使无效消息,并进入E状态,写入修改,后进入M状态。若是处于I,则须要向其余cpu核广播读消息和使无效消息,在收集到读响应后,更新cache line。在收集到使无效响应后,进入E状态,写入修改,后进入M状态。通信

缓存一致性协议使得多核cpu的共享变量之间的改变能够相互可见,按理说能够了。协议

可是在cpu和L1L2的cacheLine之间还有storebuffer这样的缓冲,这就须要volatile出场了。di

volatile修饰变量在汇编的时候会多出 lock前缀,这个前缀在“写变量”这个过程当中有两个做用:cas

一、禁止指令重排序消息

二、将当前cpu的L1以前的缓冲都刷新到L1中

 

i++的问题是写更新丢失的问题,跟如今说的不要紧,要用cas解决。

cas其实不是原子性操做,要读一次,再写一次。可是能够用MESI实现原子性:读一次发现是目标值,写的时候判断是否是I就能够。mesi实现其余原子性操做也是这个思路。

相关文章
相关标签/搜索