头图

程序猿必备知识储备(1)CPU处理器一致性协议MESI

李浩宇Alex

前提背景

为解决CPU与内存之间速率不匹配的问题,现代计算机系统中引入了缓存(Cache)用于提高性能。最初的处理器都是单核心,Cache需要解决的问题主要是Cache中的数据与内存中的数据是否一致

图1

  • Cache中缓存的数据与对应的内存行中的数据一致时,认为当前Cache行为Clean
  • Cache中缓存的数据与对应的内存行数据不一致,则认为当前Cache行为Dirty
Dirty和Clean两种状态足够表示单核系统中Cache的状态问题,而当处理器发展到多核心的时候,每个CPU核心都有了自己对应的Cache,内存中的同一行数据可能会被多块Cache缓存,并且处于不同的状态,这个时候简单的Dirty和Clean并不足够处理出现的一致性问题,于是引入了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状态

image.png

Shared状态

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

image.png

Modified和Invalid状态

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

image.png

MESI状态切换

MESI协议中的状态转换如图所示,每个Cache控制器根据自己Core的读写操作以及其他Core的读写操作来决定如何进行状态跳转

这里Local Read/Write指的是Cache对应的Core对当前数据做出的读写操作,Remote Read/Write指其他Core对当前数据做出的读写操作

下面将分析每个状态的跳转情况。

MESI状态跳转图

image.png

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
阅读 103

【欢迎互粉,互相勉励】#热衷网络技术##从事软件开发##酷爱悬疑推理##喜欢益智魔方##追求健身塑型##初窥围棋象棋#(只要世界还有重力存在,就不要把自己想的太轻)一语双关哦!

0 声望
0 粉丝
0 条评论
你知道吗?

【欢迎互粉,互相勉励】#热衷网络技术##从事软件开发##酷爱悬疑推理##喜欢益智魔方##追求健身塑型##初窥围棋象棋#(只要世界还有重力存在,就不要把自己想的太轻)一语双关哦!

0 声望
0 粉丝
宣传栏