在阅读linux相关源码的过程中,经常看到内存屏障相关原语,如mb(),rmb(),wmb等。要想理解这些原语的作用,有必要理解SMP缓存一致性原理。
在SMP系统中,处理器的每个核都有独立的一级缓存,因此同一内存位置的数据,可能在多个核一级缓存中存在多个副本,所以存在数据一致性的问题。目前主流的缓存一致性协议是MESI协议及其衍生协议。
原生的MESI协议有4种状态:
- M(Modify)修改:表示数据只存在本地处理器缓存的在副本,数据是脏的,即数据被修改过,还没有写回内存。
- E(Exclusive)独占:表示数据只存在本地处理器缓存的副本,数据是干净的,即副本和内存中的数据相同。
- S(Shared)共享:表示数据存在多个处理缓存的副本,数据是干净的,即所有副本和内存中的数据相同。
- I(Invalid)无效:表示缓存行中没有数据。
为了维护缓存一致性,处理器之间需要通信,MESI协议提供了以下消息:
- Read读:包含想要读取的缓存行的物理地址。
- Read Response读响应:包含读消息请求的数据。读响应消息可能是由内存控制器发送的,也可能是由其他处理器的缓存发送的。如果一个处理器的缓存行有想要的数据,并且处于修改状态,那么必须发送读响应消息。
- Invalidate使无效:包含想要删除的缓存行的物理地址。所有其他处理器必须从缓存行中删除对