CPU处理器缓存一致性协议MESI详解
缓存一致性的由来
为解决CPU与内存之间速率不匹配的问题,现代计算机系统中引入了缓存(Cache)用于提高性能。最初的处理器都是单核心,Cache需要解决的问题主要是Cache中的数据与内存中的数据是否一致。
以图1为例,当Cache中缓存的数据与对应的内存行中的数据一致时,认为当前Cache行为Clean;当Cache中缓存的数据与对应的内存行数据不一致,则认为当前Cache行为Dirty。
Dirty和Clean两种状态足够表示单核系统中Cache的状态问题,而当处理器发展到多核心的时候,每个CPU核心都有了自己对应的Cache,内存中的同一行数据可能会被多块Cache缓存,并且处于不同的状态,这个时候简单的Dirty和Clean并不足够处理出现的一致性问题,于是引入了MESI一致性协议。
MESI协议简介
MESI协议将Cache中的数据分为4种状态:
- Modified :代表当前Cache行的数据是修改过的(Dirty),并且只在当前CPU的Cache中是修改过的;此时该Cache行的数据与其他Cache中的数据不同,与内存中该行的数据也不同。
- Exclusive:代表当前Cache行的数据是有效数据,其他CPU的Cache中没有这行数据;并且当前Cache行数据与内存中的数据相同。
- Shared:代表多个CPU的Cache中均缓存有这行数据,并且Cache中的数据与内存中的数据一致;
- Invalid:表示当前Cache行中的数据无效;
Exclusive状态
图中Core 0对应的Cache中有(x=3)并且与内存中x值一致,而此时Core1和Core2中没有缓存这条数据。此时Core 0对应的Cache行处于Exclusive状态。
Shared状态
图中Core0/1/2中均有(x=3),并且内存中x的值也是一致的,此时Core 0/1/2对应的Cache行都是处于Shared状态。
Modified和Invalid状态
图中Core 0拥有最新的x值(x=5), 并且Core 1/2和内存中均为无效的x值(x=3)。此时认为Core 0的Cache行为Modified状态,而Core 1/2的Cache行为Invalid状态。
MESI状态切换
MESI协议中的状态转换如图所示,每个Cache控制器根据自己Core的读写操作以及其他Core的读写操作来决定如何进行状态跳转。这里Local Read/Write指的是Cache对应的Core对当前数据做出的读写操作,Remote Read/Write指其他Core对当前数据做出的读写操作。下面将分析每个状态的跳转情况。
Modified状态跳转
- Local Read :从当前Cache取数据,状态不变,还是M。
- Local Write :向当前Cache写数据,状态不变,还是M。
- Remote Read :先将这条数据写入内存,让其他Core能够拿到最新数据,状态变为S。
- Remote Write :先将这条数据写入内存,之后其他Core会修改这条数据,状态变为I。
Exclusive状态跳转
- Local Read :从当前Cache取数据,状态不变,还是E。
- Local Write :向当前Cache写数据,状态变为M。
- Remote Read :其他Core会从内存读取这条数据,变成共享状态,状态变为S。
- Remote Write :数据倍修改,当前Cache行数据无效,状态变为I。
Shared状态跳转
- Local Read :从当前Cache取数据,状态不变,还是S。
- Local Write :向当前Cache写数据,状态变成M,其他Cache中该行数据无效,变成I。
- Remote Read :对当前Cache无影响,状态还是S。
- Remote Write :数据被修改,当前行数据无效,状态变为I。
Invalid状态跳转
- Local Read :如果其他Cache没有缓存这条数据,需要从内存中读取该数据,读取之后状态变成E;
如果其他Cache有这条数据,且状态为M,则先将数据更新到内存,当前Cache再到内存中取数据,之后这两个Cache的相应行数据相同,都变成S;
如果其他Cache有这条数据,且状态为S或E,当前Cache从内存中取这条数据,这些Cache相应行数据相同,都变成S; - Local Write :从内存中读取数据,在Cache中修改,状态变成M;
如果其他Cache有这条数据,且状态为M,则要先将数据更新到内存;
如果其他Cache有这条数据,则这些Cache行变成I。 - Remote Read :对当前Cache无影响,状态还是I。
- Remote Write :对当前Cache无影响,状态还是I。