计算机体系结构期末复习4:多处理器缓存一致性(cache一致性)
目录
一、cache一致性问题
1.一致性定义
2.问题定义
3.解决问题的基本策略
二、写返回(write-back)cache的一致性处理
1.MSI协议
2.MESI协议
3.MOESI协议
三、补充知识点:提升cache性能的因素
1.cache miss的三种情况:
2.影响cache性能的因素
一、cache一致性问题
1.一致性定义
对于相同的内存位置,所有处理器看到的值是一样的。
2.问题定义
既然处理器本地更新会导致cache状态不一致,那么,如果多个处理器同时拥有一个cache block,如何保证一致性?(cache coherence)
3.解决问题的基本策略
将写操作得到的最新值及时更新到所有的cache copy.
1)写操作主要有两种处理方式:
- 更新策略(update protocol):将新数据广播给所有的cache copy.
- 无效策略(invalidate protocol):让其他所有的copy无效,只保留一份有效的本地copy,并更新它
更新策略如图:
无效策略如图:
2)消息传播的两种方式:
- 侦听式(snoopy bus)
-处理器在总线上广播数据更新(wirte propagation:当处理器写本地cache时,会广播到所有其他cache,所有cache将看到相同的更新)
-每个处理器都会侦听其他处理器的动向
-所有请求通过总线实现序列化(完全按顺序)(当两个处理器几乎同时向各自的本地copy写入相同数据时 ,一个处理器将会赢得总线,并向所有其他缓存广播其更 新信息,另一个处理器必须等待直到它能够获取总线)
- 目录式(directory)
-通过目录跟踪每个block的所有权
-处理器通过目录显示地请求数据
-目录协调无效化/更新操作
-目录充当为乱序请求“排序” 的角色
二、写返回(write-back)cache的一致性处理
写返回cache仅在block被替换出去时,才把写数据更新到memory.
于是可能引发cache和memory不一致的问题。
根据写返回的特点,我们采用无效策略。(也就是说,当有一个处理器对cache的某个block执行写操作,其他处理器cache中该block的副本都会被标记为无效状态)
1.MSI协议
1)每个cache block有三种状态
- Modified: 本地有全局唯一的copy(因为本地修改过这个copy的数据,其他cache中如果原本有这个copy都被标记为无效了。并且该copy与内存中的值也可能不同,需要标记为drity,在block替换出去时将更改同步到内存)
- Shared: 本地有只读的copy,该copy中的数据是新且正确的。可能有多个cache中的block处在shared状态。
- Invalid: 本地的copy标记为无效,可以理解为本地没有copy
2)MSI协议的转换
State | This processor | Other Processor | ||
Load miss | Store miss | Load miss | Store miss | |
I | I->S | I->M | -- | -- |
S | Hit | S->M | S | S->I |
M | Hit | Hit | M->S | M->I |
ps:当某处理器1的cache block处在Modified状态,其他处理器发起对该block的读请求时,处理器1会将cache block的内容写回内存memory,更新自身状态为shared;发起读请求的处理器获得最新的cache block,也处于shared状态。
2.MESI协议
1)MSI协议存在的问题
如果所有处理器中,某block只在一个cache中处于share状态。那么该cache修改该block时,其实不用广播消息给其他cache
2)新增状态
Exclusive:该copy是全局唯一的,且值是最新的(clean,与内存中的值一致)。当本地修改这个copy时,会直接从E状态切换到M状态,并且不需要广播。
3)MESI协议的转换
State | This processor | Other Processor | ||
Load miss | Store miss | Load miss | Store miss | |
I | I->S/E | I->M | -- | -- |
S | Hit | S->M | S | S->I |
M | Hit | Hit | M->S | M->I |
E | Hit | E->M | E->S | E->I |
3.MOESI协议
1)MESI协议存在的问题
当有某个cache block处于M状态,其他处理器发起读请求时,需要该处理器先把这个dirty block写回内存,再传给发起读请求的处理器。也就是说,每次从M->S的状态切换,都需要写内存操作,但很多时候这是没必要的,因为其他处理器也可能频繁更新该block的数据。
2)MOESI协议思路
发生M->S状态切换时,仅将最新数据传给请求者,新数据并不立即写回内存。(也就是说,shared block保持dirty状态)。而包含dirty数据的block等到从cache中换出时,再把最新数据写回内存。
于是产生了新的疑问:当多个cache中都含有shared block,且包含有dirty数据,谁负责写回内存?
3)新增状态
owner:将其中一个shared block标记为owner.owner中的block一定是dirty的,当owner的block被替换出的时候,再把最新数据写回内存。
4)MOESI协议转换
State | This processor | Other Processor | ||
Load miss | Store miss | Load miss | Store miss | |
I | I->S/E | I->M | -- | -- |
S | Hit | S->M | S | S->I |
M | Hit | Hit | M->O | M->I |
E | Hit | E->M | E->S | E->I |
O | Hit | O->M | O | O->I |
三、补充知识点:提升cache性能的因素
1.cache miss的三种情况:
- Compulsory miss:当数据第一次被访问时,由于该数据并不在缓存中,导致的未命中。这种情况通常发生在程序刚开始运行或在缓存中没有被加载过的数据。
- Capacity miss:缓存中的数据由于缓存容量不足而被替换掉,再次访问这些数据时发生的未命中。这种情况通常发生在缓存的总容量小于程序需要使用的数据量。
- Conflict miss:不属于前面两种miss 的miss.
2.影响cache性能的因素
增大cache size | 增加关联度 | 增加block size | |
Compulsory miss | = | = | ⬇ |
Capacity miss | ⬇ | = | ⬇ |
Conflict miss | ⬇ | ⬇ | ? |
hit latency | ⬆ | ⬆ | = |
miss latncy | = | = | ⬆ |