当前位置: 首页 > Linux

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

时间:2023-04-06 01:39:08 Linux

前提背景为解决CPU与内存速度不匹配的问题,现代计算机系统引入缓存(Cache)来提高性能。最初的处理器都是单核的,Cache需要解决的问题是Cache中的数据和内存中的数据是否一致。当Cache中缓存的数据与对应内存行中的数据一致时,认为当前Cache行为为Clean;当Cache中的缓存数据与对应的内存行数据不一致时,认为当前Cache行为为Dirty。Dirty和Clean状态足以表示单核系统中Cache的状态。当处理器向多核发展时,每个CPU核都有自己对应的Cache,内存中的同一行数据可能会被复用。块缓存被缓存,处于不同的状态。这时候简单的Dirty和Clean不足以应对出现的一致性问题,于是引入了MESI一致性协议。协议介绍MESI协议将Cache中的数据分为四种状态:Modified:表示当前Cacheline中的数据被修改(Dirty),仅在当前CPU的Cache中被修改;这时Cacheline中的数据和其他cache中的数据不一样,也和内存中这一行的数据不一样。Exclusive:代表当前Cacheline的数据为有效数据,其他CPU的cache中没有该行数据;并且当前的Cacheline数据和内存中的数据是一样的。Shared:这行数据缓存在多个CPU的Cache中,缓存中的数据与内存中的数据一致;Invalid:表示当前Cacheline中的数据无效;Exclusive状态图中Core0对应的Cache有(x=3)并且与内存中的x值一致,此时Core1和Core2中没有缓存此数据。此时Core0对应的Cacheline处于Exclusive状态。Shared状态图中,Core0/1/2有(x=3),内存中x的值也是一致的。此时Core0/1/2对应的Cacheline都处于Shared状态。在Modified和Invalid状态图中,Core0具有最新的x值(x=5),而Core1/2和内存均具有无效的x值(x=3)。此时认为Core0的Cache处于Modified状态,Core1/2的Cache处于Invalid状态。MESI状态转换MESI协议中的状态转换如图所示。每个Cachecontroller根据自己Core的读写操作和其他Core的读写操作来决定如何进行状态转换。这里的LocalRead/Write是指Cache对应的Core对当前数据进行的读写操作,RemoteRead/Write是指其他Core对当前数据进行的读写操作。下面将分析每个状态的转换。MESI状态转换图ModifiedstatetransitionLocalRead:从当前Cache取数据,状态不变,还是M.LocalWrite:往当前Cache写数据,状态不变,还是M.RemoteRead:把这个数据写入RemoteWrite:先把这个数据写入内存,其他Core会修改这个数据,状态变成I。独占状态跳转到LocalRead:从当前Cache取数据,状态不变,还是E。LocalWrite:向当前Cache写入数据,状态变为M。RemoteRead:其他Core会从内存中读取这块数据,变为共享状态,状态变为S。RemoteWrite:数据被修改,当前Cache行数据无效,状态变为I。Shared状态跳转为LocalRead:从当前Cache中取数据,并LocalWrite:向当前Cache写入数据,状态变为M,其他Cache中行数据无效,变为I。RemoteRead:对当前Cache无影响,并且状态还是S。RemoteWrite:数据被修改,当前行数据无效,状态变为I。无效状态跳转到LocalRead:**如果其他Cache没有缓存此数据,则需要读取从内存中取出数据,读取后状态变为E;如果其他Cache有这个数据,并且状态为M,先将数据更新到内存中,当前Cache从内存中取数据。之后,两个Cache对应的行有相同的数据,都变成S**;如果其他Cache有这条数据,状态为S或E,则当前Cache从内存中取这条数据,这些Cache对应的行数据相同,都变成S;LocalWrite:读取内存中的数据,在缓存中修改,状态变为M;如果其他缓存有这个数据,状态为M,先更新数据到内存;如果其他缓存有此数据,则这些缓存行变为I。RemoteRead:对当前Cache没有影响,状态还是I。RemoteWrite:对当前Cache没有影响,状态还是I。