【推荐阅读】
对称多处理(SMP)或集中式共享存储器:一致性内存访问(UMA),缺点是对内存带宽要求高、难扩展
分布式共享存储器(DSM):非一致性内存访问(NUMA),缺点是访问本地内存延迟低、带宽高,访问远端内存延迟高、带宽低
多处理器系统:有些数据是多个处理器共享的,共享数据在每个cache中(每个处理器具有私有的L1 cache)均缓存,带来缓存一致性问题。
缓存一致性 :一个处理器核读取某个地址时,总是得到该地址对应的最新值。保证缓存一致性的两种典型方法:监听式、目录式。
监听式协议
写更新协议 :处理器写入某一数据时,同步更新所有副本;总线开销大,不常用
写失效协议 :处理器写入某一数据之前,获取该数据的独占权,在写入数据时强制其它副本作废(过程:处理器在总线上广播地址、其他处理器监听地址并判断该地址是否在自己的cache中,如果在则使其失效),最常用的协议,如下示例:
如果发生cache miss:如果是write through系统,很容易找到最新的值(因为已经写到系统中)。但如果是write back系统,就不太容易,因为有可能有个处理器修改了该数据(将其标为dirty),但是还没有写到内存中,即最新的值在该处理器的私有cache中。解决:发生cache miss的处理器会将所需数据地址放到总线上,其他所有处理器均会监听,如果发现自己有该地址的dirty副本,则响应请求。注:cache line的标签和有效位会帮助实现监听。
写回系统的写无效协议
每个block的可能状态:未缓存、clean、dirty(只有一个cache有)。所以,MSIMSI协议中,block具有如下三种状态:
Invalid(无效的):block中没有有效数据
Shared(共享的):a clean block
Modified(修改的/独占的):a dirty block
注意:一个block如果在一个cache中是修改的,那么在其他所有cache中均是无效的
例子:考虑两个处理器C1与C2
若C1发生读取缺失,且C2有这个块,那么C2中断内存响应并写回,C1得到后该块在所有cache中为共享状态。
若C1在一个共享块上发生写命中,那么C1将地址放到总线上,其他处理器监听并使对应副本失效。
若C1在一个修改块上发生写命中,并没有什么发生。
若C1在一个无效块上发生写缺失,C1将地址放到总线上,其他处理器监听:
若C2的对应块为共享,那么C2使其失效。
若C2的对应块为修改,那么将其写回并令其失效。
若没有cache有这个块,那么内存将提供。
若C1得到这个块,将其状态设置为修改。
MSIMSI缺陷:操作不是原子性的,可能造成死锁和竞争,解决办法,MES****IMESI增加独占(Exclusive)状态,一个处理器对一个缓存行拥有“独占”权限时,写入操作无需总线广播。
目录式协议
监听式协议对集中总线的带宽要求较高,难以扩展。目录式协议:每个处理器核上存在一个目录,记录它所负责的内存地址的共享状态。
主节点:一个地址的存储器位置及目录所在节点
请求节点:发出访存请求的节点(发出访存请求的也可能是主节点)
目录式协议的缺陷:存储开销,优化:有限指针方案,利用大多数处理器不共享行的事实;稀疏目录方案,利用大多数行不一致的事实