一个cpu运行计算的步骤例如以下:
1.程序以及数据被载入到主内存
2.指令和数据被载入到cpu的快速存储
3.cpu运行指令,把结果写到高速缓存
4.高速缓存中的数据回写到主内存
MESI是一种主流的缓存一致性协议,已经用在Pentium和PowerPC处理器中。
modified(改动):缓存块已经改动,必须被写回主存。其它处理器不能再缓存这个块
exclusive(相互排斥):缓存块还没有被改动,且其它处理器不能装入这个缓存块
share(共享):缓存块未被改动,且其它处理器能够装入这个缓存块
invalid(无效):缓存块中的数据无效
上图展示了MESI高速缓存一致性协议的状态转换实例。
1.在a中,处理器A从地址a读取数据,将数据存入它的缓存并置为exclusive
2.在b中,当处理器B试图从同样地址a读取数据时。A检测到地址冲突,以相关数据做出响应。此时a同一时候被A和B以share状态装入缓存
3.在c中,当B要对共享地址a进行写操作。则将状态改为modified,并广播提醒A,让它将它的缓存状态设置为invalid
4.在d中,当A试图从a读取数据时,会广播它的请求。B则把它改动的数据发送到A和主存,并设置两个副本的状态为share来做出相应
缓存一致性协议存在一个最大的问题是可能引起缓存一致性流量风暴。之前我们看到总线在同一时刻仅仅能被一个处理器是使用。当有大量缓存被改动,或者同一个缓存块一直被改动时,会产生 大量的缓存一致性流量。从而占用总线,影响了其它正常的读写请求