第3章 Coherency and Consistency

来源:互联网 发布:柏曼灯具怎么样知乎 编辑:程序博客网 时间:2024/06/01 08:46

本章出现的CoherencyCache CoherencyConsistencyMemory Consistency。许多工程师经常混淆这两个概念,没有建立足够准确的Memory Consistency概念。ConsistencyCoherency之间有一定的联系,所关注的对象并不等同。

MemoryConsistency的实现需要考虑处理器系统Cache Coherency使用的协议。除了狭义Cache之外,在处理器系统中存在的广义Cache依然会对Memory Consistency模型产生重大影响。Memory ConsistencyCache Coherency有一定的联系,但是并不对等。这两部分内容相对较为复杂,可以独立成篇。有些学者认为Cache CoherencyMemory Consistency的一部分[55],更为准确的说是Memory Coherency的一部分。

我们首先给出MemoryCoherency的定义。Memory Coherency指处理器系统保证对其存储器子系统访问Correctness。我们并不关注对处理器私有空间的存储器访问,仅考虑共享空间的这种情况,即便在这种情况下定义Correctness依然很困难。

在一个DistributedSystem中,共享存储器空间可能分布在不同的位置,由于广义和狭义Cache的存在,这些数据单元存在多个副本;在Distributed System中,不同处理器访问存储器子系统可以并发进行,使得Memory Coherency层面的Correctness并不容易保证。

我们假设在一个DistributedSystem中含有n个处理器分别为P1~PnPi中有Si个存储器操作,此时从全局上看可能的存储器访问序列有(S1+S2+…+Sn)! /(S1! ×S2×…×Sn)种组合[56]。为保证Memory CoherencyCorrectness,需要按照某种规则选出合适的组合。这个规则被称为Memory Consistency Model,也决定了处理器存储器访问的Correctness。这个规则需要在Correctness的前提下,保证操作友好度的同时,保证多处理器存储器访问较高的并行度。

在不同规则定义之下,Correctness的含义并不相同,这个Correctness是有条件的。在传统的单处理器环境下,Correctness指每次存储器读操作所获得的结果是Most Recent写入的结果。在Distributed System中,单处理器环境下定义的Correctness,因为多个处理器并发的存储器访问而很难保证。在这种环境下,即便定义什么是Most Recent也很困难。

在一个DistributedSystem中,最容易想到的是使用一个Global Time Scale决定存储器访问次序,从而判断Most Recent,这种Memory Consistency Model即为Strict Consistency,也被称为Atomic ConsistencyGlobal Time Scale不容易以较小的代价实现,退而求其次采用每一个处理器的Local Time Scale确定Most Recent的方法被称为Sequential Consistency[56]

SequentialConsistency要求不同处理器的写操作对于所有处理器具有一致的Order不同,Causal Consistency要求具有Inter-Process Order的写操作具有一致的Order,是Sequential Consistency的一种弱化形式。Processor Consistency进一步弱化,要求来自同一个处理器的写操作具有一致的Order即可。Slow Memory是最弱化的模型,仅要求同一个处理器对同一地址的写操作具有一致的Order[56]

以上这些ConsistencyModel针对存储器读写指令展开,还有一类目前使用更为广阔的Model。这些Model需要使用Synchronization指令,这类指令也被称为Barrier指令。在这种模型之下,存储器访问指令被分为DataSynchronization指令两大类。其中Synchronization指令能够Issue的必要条件是之前的Data指令执行完毕,其他指令在Synchronization指令执行完毕前不能进行Issue。在Synchronization指令之间的存储器访问需要依照处理器的约束,可以Reordered也可以Overlapped

在这种Model中,Data指令的Order并没有受到关注,所有规则仅针对Synchronization指令起作用,也因此产生了Weak ConsistencyRelease ConsistencyEntry Consistency[55][56]三个主要模型。这些模型将在下文做进一步的说明。

对于不支持NetworkPartitionsDistributed System,可以在实现Strict Data Consistency的同时实现Availability[1]。而对于一个较大规模的Distributed System中,Network Partitions是一个先决条件。例如在一个大型系统中,所使用的Web服务器和数据库系统已经分布在世界上的很多角落,Network Partitions已经是一个事实。

ConsistencyAvailabilityPartition-Tolerance三者不可兼得[57],这使得在一个Network PartitionsDistributed System中,必须在ConsistencyAvailability之间进行Trade-Off,也引出了Eventually Consistent模型[58]。这种模型是另一种Weak Consistency Model,基于一个数据在较长时间内没有发生更新操作,所有数据副本将最终一致的假设。

EventuallyConsistentDNS(Domain Name System)系统中得到了较为广泛的应用,也是Distributed Storage领域的用武之地。这些内容在Cloud崭露头角之后迅速成为热点,却不是本篇重点。我依然相信在Cloud相关领域工作的人必然可以在处理器存储器子系统的精彩中获得进一步前进的动力,可能是源动力。

这些内容超出了本书的覆盖范围,我们需要对Cache Coherency做进一步说明。从上文中的描述可以发现Memory Consistency关注对多个地址进行的存储器访问序列;Cache Coherency单纯一些,关注同一个地址多个数据备份的一致性。不难发现Cache CoherencyMemory Coherency的基础。

CacheCoherency要求写操作必须最终广播到参与Cache Coherency的全部处理器中,即Write Propagation;同时要求参与Cache Coherency的处理器所观察到的对同一个地址的写操作,必须按照相同的顺序进行,即Write Serialization

WritePropagationInvalidate-BasedUpdate-Based两种实现策略。Invalidate-Based策略的实现首先是确定一次存储器访问是否在本地Cache Hit,如果Hit而且当前Cache Block状态为广义的Exclusive/Ownership,不需要做进一步的操作;否则或者在Cache Miss时需要获得所访问地址的Exclusive/Ownership。此时进行存储器访问的CPU向参与Coherency的所有CPU发送RFO(Read for Ownership)广播报文,这些CPU需要监听RFO报文并作出回应。

如果RFO报文所携带的地址命中了其他CPUCache Block,需要进一步观察这个Cache Block所处的状态,如果这个Cache Block没有被修改,则可以直接Invalidate;否则需要向发出请求的CPU回应当前Cache Block的内容,在多数情况下,被修改的Cache Block只有一个数据副本。这种方法在Share-Bus的处理器系统中得到了最广泛的应用,如果存储器访问连续命中本地Cache,命中的Cache Block多处于Exclusive状态,不需要使用RFO报文,因此不会频繁地向处理器系统发出广播操作,适合Write-Back方式。

Update-based策略的实现通常使用Central Directory维护Cache BlockOwnership,在Cache Block Miss时,需要Write Update其他CPU Cache Block存在的副本,可以视网络拓扑结构同时进行多个副本的同步,即便如此所带来的Bus Traffic仍较严重,适用于使用Directory进行一致性操作的大型系统。如果进一步考虑实现细节中的各类Race Condition,完成这种方式的设计并不容易。

除了InvalidateUpdate-Based策略之外,Cache Coherency可以使用Read Snarfing策略。在这种实现方式中,可以在一定程度上避免再次ReadWrite-InvalidateCache Block时,引发的Miss。当一个CPU读取一个Data Block时,这个读回应除了需要发给这个CPU之外,还需要更新其他CPU刚刚InvalidateCache Block。在实现中,其他CPU可以监控这个读回应的地址与数据信息,主动更新刚刚Invalidate的数据拷贝[59]

在参考文献[59]的模式中,使用Read Snarfing策略可以减少36~60%Bus Traffic。但是这种方式的实现较为复杂,目前尚不知在商业处理器是否采用过这样的实现方式。在学术领域,Wisconsin Multicube模型机曾经使用过Read Snarfing策略[61]

WriteSerialization的实现需要使用Cache Coherent ProtocolBus Transaction。类似RFO这样的广播报文必不可少。在使用Share BusRing-Bus互连时,较易实现Write SerializationDirectory方式在对同一个地址Cache Block的并发写时需要使用额外的逻辑处理ACK Conflict,这些逻辑大多设置在Home Agent/Node中。



[1]Availbility指来自任何一个处理器的读写请求一定可以获得Response

0 0
原创粉丝点击