每个处理器,在自己的高速缓存中都有变量副本,这就有了缓存不一致问题,因此有了MESI协议。
MESI协议将缓存行状态flag分为4种:
- invalid:无效的,标记为I,当前cache entry无效,数据不能使用
- shared:共享的,标记为S,当前cache entry有效,数据在各个处理器中都有副本,且副本值都和主内存一致
- exclusive:独占的,E,当前处理器对这个数据独占,只有它有数据副本,其他处理器没有
- modified:修改过的,M,只能有1个处理器对共享数据更新

处理器0读取某个变量的数据,根据内存地址解码,得到index + tag + offset,并以此从高速缓存的拉链散列表中拿到数据。如果发现数据无效,就会发送read消息到总线bus。此时主内存会把数据交给总线bus,总线bus再将其return给处理器0。处理器0会把数据放到高速缓存的cache entry中,flag设为 共享。
处理器1也会读取数据到自己的高速缓存中。
当处理器0修改数据时,会发送invalidate消息到总线bus。处理器1会嗅探到这条invalidate消息,会将自己高速缓存中的flag设为无效,并return invalidate ack消息给总线bus。
处理器0嗅探到 其他所有处理器返回的invalidate ack消息,会将自己高速缓存中的数据加锁,并将状态从共享S —> 独占E。
处理器0对这条消息独占期间,其他处理器就不允许修改数据了。即使其他处理器也想修改这条数据,发送invalidate消息给总线bus,处理器0是不会回复invalidate ack消息的。因此其他处理器的修改操作无效。
等处理器0修改数据完毕后,会把状态设为 修改过的M,同时处理器0不再持有这条数据的锁了。
版权声明:本文为qq_36299025原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。