总算是把Hennessy&Patterson的多处理器和线程级并行拿下了,由于多处理器领域的问题多多,很多也没有一个统一的解决标准,所以关于这一领域两位大师主要是把研究集中在了Cache一致性上,也就是如何保证多核间共享的数据可以保持一致。
总体上分为两种策略:1. snooping--监听策略,2. Directory based--基于目录
在我们分析两种策略前,先明白几个问题,首先我们要知道我们的,目标是什么?系统模型是什么?
1.模型与需求
系统模型有两种,分别对应两种策略,第一种模型是多处理器对称的共享存储器,每个处理器有自己的Cache,各Cache挂到总线上与存储器通信。第二种模型是多处理器分布的共享存储器,每个处理器有自己的存储器,Cache,各处理模块通过网络互连。这两种模型都共享存储器,他们的目的都是让个处理器都能访问到正确的数据,也即Cache和存储器中的数据对所有的处理器来说都是一致的。
2.确定计划
要想保证一致性,需要满足以下三大条件:
a.P1对X写数据,然后P1对X读数据,且期间没有别的P对X写,那么此时读到的是P1修改过的数据。
b.P1对X写数据,然后p2对X读数据,且期间没有别的P对X写,那么此时独到的是P1修改过的数据。
c.各个P对X的写需要串行化,也就是按序写。
我们假定只要满足以上三个条件就可以保证一致性,那么我们就设计协议以满足上面三个条件。
3.建立构思
在建立构思前,我们约定我们的系统具有以下的存储机制。
a.处理器通过Cache访问内存,如果命中Cache则为hit,否则为Cache miss,此时需要把内存里的数据读到Cache。
b.处理器的写操作采用write back回写机制,也就是写操作只立即更新Cache,不立即更新内存,直到更新过的Cache需要被替换时才更新相应的内存。
下面开始构思:
由上述约定,我们发现,一个cache块可能还不含数据,可能含数据且未被修改过,含的数据可能是多个P的共享数据,也可能已经被修改过,于是我们将一个Cache块分为以下几类:Invalid(无效),Shared(共享),Exclusive(独占)。
Invalid:
无效状态表明此Cache现在不能用,为什么不能用呢,有可能是它还没有被初始化过,也可能是它已经不包含正确数据,此时往往是因为它收到了一个无效的指令,后面会提到。
Shared:
共享状态表明此Cache含有1个或多个P的有效数据。
Exclusive:
独占或修改状态,表明此Cache块已经被修改过,而且被修改者独占。
三种状态确定好了,我们从逻辑分析的角度可以猜想下一步是设计状态间的转换,就像一个状态机一样。实际上共享协议就是一个状态机:任何状态下的Cache收到一个来自Cpu的miss(read/write),都会替换该Cache。对于read,此时是从内存还是其他Cache中获得需要值则看是否有Exclusive状态的Cache,若有则该Cache提供数据,否则有内存提供。对于write,若存在其他共享态的Cache含有该地址,则该Cache要被置无效,这很好理解,因为此时地址的值已经被修改了,其他Cache中该地址的值一定是不正确的,所以要置无效。
掌握了这个思想其他状态的转移也就可想而知了,读者请自行分析...