就硬件而言,CPU、芯片、处理器、内存、总线、磁盘等等,构成了一台电脑,当电脑运行一个程序的时候,需要从磁盘读到主内存,主内存再到缓存,最后交由CPU执行。
随着现在的多核处理器的发展,运算的速度是越来越快,但是在运算的同时,也要遇到缓存一致性的问题,简单来说,多核处理器,每个核上有个多个处理器,每个处理器上又有着Cache高速缓存,C0,C1,C2, 从主内存当中读取一个变量,如果C0更改了这个变量,C1,C2,不能及时的去更新当前的值,就会使用一开始从主内存读取的变量进行运算,结果就会导致脏数据。因此,出现了MESI缓存一致性进行控制
目前处理器基本上都遵循这个协议,先大概解释下MESI,
状态 | 描述 |
M(modified) | 这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在本Cache中 |
E(Exclusive) | 这行数据有效,数据和内存中的数据一致,数据只存在云本Cache中 |
S(share) | 这行数据有效,数据和内存中的数据一致,数据存在很多的 Cache中 |
I(Invalid) | 在很多的Cache中,这行数据无效 |
M (modified) 和 E (Exclusive) 状态的Cache line,数据是独有的,不同点在于M状态的数据是dirty的(和内存不一致),E状态的数据是clean的(内存一致).
S (Shared) 状态的Cache line,数据和其他的Cache共享。只有clean的数据才能被多个Cache共享
I (Invalid)表示这个Cache line无效。
E 状态示例如下:
只有C0访问变量x,它的Cache line状态为E(Exclusive)
S 状态示例如下:
3个Core都访问变量x,它们对应的Cache line为S (Shared)的状态
M状态和 I 的状态示例如下:
Core0修改了x的值之后,这个Cache line变成了M(modified)状态,其他Core对应的Cacheline变成了I(Invalid)状态
在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听到(snoop)其他Cache的读写操作。每个Cache line所处的状态根据本该和其他核的读写操作在4个状态间进行迁移