文章插图
高速缓冲存储器一致性
【高速缓冲存储器一致性】高速缓冲存储器一致性(Cache coherence),也称快取一致性,高速快取间一致性 。是指在採用层次结构存储系统的计算机系统中,保证高速缓冲存储器中数据与主存储器中数据相同机制 。在一个系统中,当许多不同的设备共享一个共同存储器资源,在高速快取中的数据不一致,就会产生问题 。这个问题在有数个CPU的多处理机系统中特别容易出现 。
基本介绍中文名:高速缓冲存储器一致性
外文名:Cache coherence
学科:计算机系统
别名:快取一致性,高速快取间一致性
目的:保证快取与主存储器
原因:共同存储器资源
简介记忆体系统的本质是,一个记忆体系统应该能提供一组保存值的存储单元,当对一个存储单元执行读操作时,应该能返回“最近”一个对该存储单元的写操作所写入的值 。在串列程式中,程式设计师利用记忆体来将程式中某一点计算出来的值,传递到该值的使用点,实际上就是利用了以上的基本性质 。同样,运行在单处理器上的多个进程或执行绪利用共享地址空间进行通信,实际上也是利用了记忆体系统的这个性质 。一个读操作应返回最近的向那个位置的写操作所写的值,而不管是哪个执行绪写的 。当所有的执行绪运行在同一个物理处理器上时,它们通过相同的高速快取层次来看记忆体,因此在这种情况下,高速快取不会引起问题 。当在共享存储的多处理器系统上运行一个具有多个进程的程式时,希望不管这些进程是运行在同一个处理器上,还是在不同的处理器上,程式的运行结果都是相同的 。然而,当两个运行在不同的物理处理器上的进程通过不同的高速快取层次来看共享记忆体时,其中一个进程可能会看到在它的高速快取中的新值,而另一个则可能会看到旧值,这样就引起了一致性问题 。高速缓冲存储器一致性的比较正式的一个定义是当一个共享存储的机器满足以下条件时,则可以认为该系统是高速缓冲存储器一致的:
任何进程所发出的访存操作被存储器所观察到的顺序必须与进程发出操作的顺序相同;
每个读操作所返回的值必须是最后一次对该存储位置的写操作的值 。
以上定义保证了两个属性写广播和写串列化 。写广播指的是写操作被其他所有处理器所观察到 。定串列化是指对某一存储位置的所有写操作的顺序,在所有处理器看来都是一样的 。高速缓冲存储器一致性可以分为三个层级:
在进行每个写入运算时都立刻採取措施保证数据一致性;
每个独立的运算,假如它造成数据值的改变,所有进程都可以看到一致的改变结果;
在每次运算之后,不同的进程可能会看到不同的值(这也就是没有一致性的行为) 。
一致性关于一致性的概念,直观上可以定义为每个读操作必须返回最后写入此位置的值 。对于每个处理器单元的操作都有一个总体的、串列的操作序是我们希望在任何一个一致性存储系统中见到的 。因此,可以对高速快取一致性进行一个更加形式化的定义方法:如果某个程式的任何执行结果都满足下列条件:对于任何单元,有可能建立一个假想的操作序列(也就是说,将所有进程发出的读写操作排成一个全序,此序列与执行结果一致,并且在序列中:(任何特定进程发出的操作所表现出来的序和该进程向存储系统发出它们的序相同,且每个读操作返回的值是对相应单元按照串列顺序写入的最后一值,那幺此多处理器存储系统是一致性 。此外,关于多个私有快取还存在另外一方面的问题:如果数据是由一个处理器核对某个单元写入,而另一个处理器从中读出这样的方式来进行传递的话,那幺我们前面所关注的一致性将是非常重要的 。最终,写在一个单元中的数据将对所有的读取者都会是可见的,但这种一致性并没有指明所写入的数据何时会成为可见的 。通常,在编写一个并行程式时,我们希望在写和读之间建立一种序,即我们需要定义一个序模型,依照该模型,程式设计师能推断他们程式的执行结果及其正确性 。这个模型就是存储同一性 。一个完整的一致性模型包括髙速快取一致性及存储同一性两个方面,且这两个是互补的:高速快取一致性定义了对同一个存储地址进行的读写操作行为,而存储同一性模型定义了访问所有存储地址的读写行为 。在共享存储空间中,多个进程对存储的不同单元做并发的读写操作,每个进程都会看到一个这些操作被完成的序 。一个存储同一性模型规定了对这种序的若干约束,值得一提的是,这里所涉及到的并发存储操作既包括对相同单元的,也包括对不同单元的;即可以来自同一进行,也可以来自不同的进程 。在这个意义上,存储同一性包含了高速快取一致性 。实现高速快取一致性协定是解决快取一致性问题的主要方案,同时也是保证存储同一性的重要手段 。它定义了共享快取块在各个私有快取中的存在形式,并详细定义了各个私有快取之间的通信行为 。学术界及工业界已经提出了多种高速快取一致性协定模型,但所有模型的出发点都是一样的,它们都是为了保证存储模型SWMR(single-writer,multiple-reader)属性,即对于一个给定的快取块,在系统运行的任意时刻,保证(1)同时只能有一个处理器核拥有对此快取的写许可权;或者(2)同时可以有零个或者多个处理器核拥有对此快取块的读许可权 。根据共享数据的修改方式的不同,可以将髙速快取一致性协定的实现分为两种形式:写无效协定、写更新协定 。其中,在写无效协定中,处理器核在对某个存储块进行写操作之前,必须保证当前的处理器核拥有对此快取块的读写权 。如果两个或者多个处理器核试图同时访问同一个数据项并执行写操作,那幺它们中同时只能有一个在进行,另一个访问请求会被阻塞;在某个处理器执行写操作时,其它所有私有快取中该数据的副本都会被置为无效状态 。在当前处理器完成写操作后,后续的对此数据的所有操作,都必须首先获得此新写入数据的副本 。因此,写无效型的协定强制执行了写操作的串列化 。写更新协定也称为写广播协定,它是指处理器核在对某个数据进行写操作时,同时更新当前数据在其它所有快取中的数据副本 。有两种主要的快取一致性协定:基于侦听形式的高速快取一致性协定(或侦听协定)及基于目录结构的高速快取一致性协定(或目录协定) 。在这两种协定中,侦听协定的实现依赖于一个汇流排或者类汇流排形式的网路连线,使用此网路,单个处理器核的私有快取所发出的所有请求会被广播到系统中所有的其它处理器核的私有快取中,而所有处理器的访问请求也可以在此汇流排上进行定序操作,以实现快取一致性模型及存储同一性模型中对访存序的要求 。此外,此协定还可以通过汇流排结构来很好的处理对同一数据块的多个冲突请求,而且多个处理器的私有快取之间可以通过此汇流排结构进行直接的通信,减少了通信延迟 。但是,由于所有请求都是通过汇流排来进行传输的,但汇流排频宽资源有限,因此它会影响整个系统的扩展性 。目录协定则是釆用一个目录结构来实现对快取块的管理的 。在目录协定中,处理器核的私有快取发出的访存请求,会首先传送到拥有相应快取块的目录结构中,此目录结构中记录了当前快取块的共享情况,目录结构控制器会根据当前快取块的状态,选取回响此请求或者转发此请求到其它相应的私有快取中 。此种方法不需要依赖于特定拓扑结构的网路,并通过点对点的直接通信形式降低了网路中的频宽消耗,因此这种协定易于扩展 。但由于此协定的实现中,所有请求都必须通过目录结构进行处理,因此会引入额外的延迟 。MESI协定编辑单核Cache中每个Cache line有2个标誌:dirty和valid标誌,它们很好的描述了Cache和Memory(记忆体)之间的数据关係(数据是否有效,数据是否被修改),而在多核处理器中,多个核会共享一些数据,MESI协定就包含了描述共享的状态 。在MESI协定中,每个Cache line有4个状态,可用2个bit表示,它们分别是:M(Modified):这行数据有效,数据被修改了,和记忆体中的数据不一致,数据只存在于本Cache中 。E(Exclusive):这行数据有效,数据和记忆体中的数据一致,数据只存在于本Cache中 。S(Shared):这行数据有效,数据和记忆体中的数据一致,数据存在于很多Cache中 。I(Invalid):这行数据无效 。在该协定的作用下,虽然各cache控制器随时都在监听系统汇流排,但能监听到的只有读未命中、写未命中以及共享行写命中三种情况 。读监听命中的有效行都要进入S态并发出监听命中指示,但M态行要抢先写回主存;写监听命中的有效行都要进入I态,但收到RWITM时的M态行要抢先写回主存 。总之监控逻辑并不複杂,增添的系统汇流排传输开销也不大,但MESI协定却有力地保证了主存块髒拷贝在多cache中的一致性,并能及时写回,保证cache主存存取的正确性 。