CPU处理器一致性协议MESI详解

缓存一致性的由来

为解决CPU与内存之间速率不匹配的问题,现代计算机系统中引入了缓存(Cache)用于提高性能。最初的处理器都是单核心,Cache需要解决的问题主要是Cache中的数据与内存中的数据是否一致。
以图1为例,当Cache中缓存的数据与对应的内存行中的数据一致时,认为当前Cache行为Clean;当Cache中缓存的数据与对应的内存行数据不一致,则认为当前Cache行为Dirty。
图1 Cache行的两种状态
Dirty和Clean两种状态足够表示单核系统中Cache的状态问题,而当处理器发展到多核心的时候,每个CPU核心都有了自己对应的Cache,内存中的同一行数据可能会被多块Cache缓存,并且处于不同的状态,这个时候简单的Dirty和Clean并不足够处理出现的一致性问题,于是引入了MESI一致性协议。

MESI协议简介

MESI协议将Cache中的数据分为4种状态:

  1. Modified :代表当前Cache行的数据是修改过的(Dirty),并且只在当前CPU的Cache中是修改过的;此时该Cache行的数据与其他Cache中的数据不同,与内存中该行的数据也不同。
  2. Exclusive:代表当前Cache行的数据是有效数据,其他CPU的Cache中没有这行数据;并且当前Cache行数据与内存中的数据相同。
  3. Shared:代表多个CPU的Cache中均缓存有这行数据,并且Cache中的数据与内存中的数据一致;
  4. Invalid:表示当前Cache行中的数据无效;

Exclusive状态

图中Core 0对应的Cache中有(x=3)并且与内存中x值一致,而此时Core1和Core2中没有缓存这条数据。此时Core 0对应的Cache行处于Exclusive状态。
Exclusive状态

Shared状态

图中Core0/1/2中均有(x=3),并且内存中x的值也是一致的,此时Core 0/1/2对应的Cache行都是处于Shared状态。
Shared状态

Modified和Invalid状态

图中Core 0拥有最新的x值(x=5), 并且Core 1/2和内存中均为无效的x值(x=3)。此时认为Core 0的Cache行为Modified状态,而Core 1/2的Cache行为Invalid状态。

Modified和Invalid状态

MESI状态切换

MESI协议中的状态转换如图所示,每个Cache控制器根据自己Core的读写操作以及其他Core的读写操作来决定如何进行状态跳转。这里Local Read/Write指的是Cache对应的Core对当前数据做出的读写操作,Remote Read/Write指其他Core对当前数据做出的读写操作。下面将分析每个状态的跳转情况。
MESI状态跳转图

Modified状态跳转

  1. Local Read :从当前Cache取数据,状态不变,还是M
  2. Local Write :向当前Cache写数据,状态不变,还是M
  3. Remote Read :先将这条数据写入内存,让其他Core能够拿到最新数据,状态变为S
  4. Remote Write :先将这条数据写入内存,之后其他Core会修改这条数据,状态变为I

Exclusive状态跳转

  1. Local Read :从当前Cache取数据,状态不变,还是E
  2. Local Write :向当前Cache写数据,状态变为M
  3. Remote Read :其他Core会从内存读取这条数据,变成共享状态,状态变为S
  4. Remote Write :数据倍修改,当前Cache行数据无效,状态变为I

Shared状态跳转

  1. Local Read :从当前Cache取数据,状态不变,还是S
  2. Local Write :向当前Cache写数据,状态变成M,其他Cache中该行数据无效,变成I
  3. Remote Read :对当前Cache无影响,状态还是S
  4. Remote Write :数据被修改,当前行数据无效,状态变为I

Invalid状态跳转

  1. Local Read :如果其他Cache没有缓存这条数据,需要从内存中读取该数据,读取之后状态变成E
    如果其他Cache有这条数据,且状态为M,则先将数据更新到内存,当前Cache再到内存中取数据,之后这两个Cache的相应行数据相同,都变成S;
    如果其他Cache有这条数据,且状态为S或E,当前Cache从内存中取这条数据,这些Cache相应行数据相同,都变成S;
  2. Local Write :从内存中读取数据,在Cache中修改,状态变成M
    如果其他Cache有这条数据,且状态为M,则要先将数据更新到内存;
    如果其他Cache有这条数据,则这些Cache行变成I
  3. Remote Read :对当前Cache无影响,状态还是I
  4. Remote Write :对当前Cache无影响,状态还是I
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章