CPU多核缓存架构
缓存一致性协议(MESI)
M 修改(Modified)
该缓存行只被缓存在该CPU的缓存中,并且是被修改过的,即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它CPU读取请主存中相应内存之前)写回主存
E 独享(Exclusive)
该缓存行只被缓存在该CPU的缓存中,它是未被修改过的,与主存中数据一致。该状态可以在任何时刻当有其它CPU读取该内存时变成共享状态(shared)
S 共享(Shared)
该状态意味着该缓存行可能被多个CPU缓存,并且各个缓存中的数据与主存数据一致,当有一个CPU修改该缓存行中,其它CPU中该缓存行可以被作废(变成Invalid)
I 无效(Invalid)
该缓存是无效的(可能有其它CPU修改了该缓存行)
工作原理
程序中变量 int count = 0; count ++;
1. 假设CPU1率先抢到时间片,当变量count加载至CPU缓存中时,会将count的使用标志为(E独占:首次加载会将变量置为独占,也就说明没有其他CPU进行加载)
-
CPU2也获得时间片,把变量count加载缓存中,此时count的使用标志为(E独占),并发送消息至总线,告知其他CPU读取了变量的值,各CPU通过时刻监听(总线嗅探机制)获得到此变量已被多个CPU所加载,那么此时CPU2就会将自身count的使用标志置为(S共享),CPU1也会将变量的使用标志也会置为(S)
-
CPU1从缓存中加载count至寄存器中进行自增操作,执行完毕之后,count = 0 -> 1,此时由于count的值发生了变化,因此CPU1中变量count使用标志应为(M修改),此时CPU1会发送消息至总线,告知其他线程已经修改了变量count 的值,其他CPU嗅探到值的修改,就会将自身变量count的使用标志置为(I无效)
-
CPU1会将M状态的变量立刻写回至主内存中,写回完毕之后,CPU1会将使用状态置为(E独享),发送消息至总线,告知其他CPU已经写回完毕,其他CPU会再此从主内存中读取变量count的值,读取完毕之后,也会发送消息至总线,其他CPU嗅探到之后将自身变量count置为(S共享),自身变量的使用状态也会置为(S共享)