一致性模型本质上是软件与存储器之间的协约问题。如果软件遵守约定的规则,存储器就能正常工作;反之,存储器就不能保证操作的正确性1。内存一致性模型描述的是程序在执行过程中内存操作正确性的问题。内存操作包括读操作和写操作,每一操作又可以用两个时间点界定:发出(Invoke)和响应(Response)。
简介内存一致性模型描述的读操作和写操作这些操作可能的执行顺序中那些是正确的。在假定没有流水线的情况下(即单个处理器内指令的执行是按顺序执行的),设系统内共有N个处理器,每个处理器可发出个内存操作(读或写),那么总共有:种可能的执行顺序。常见的内存一致性模型有线性一致性、原子一致性、缓存一致性以及顺序一致性。
内存一致性模型的研究历史按照传统冯诺依曼体系结构的计算模型来看,读操作应当返回最近的写操作所写入的结果,但是这里“最近”的含义是比较模糊的。因此必须将概念严格化,于是产生了线性一致性(或称做严格一致性Strict consistency、原子一致性Atomic consistency)的概念。但是线性一致性太难实现了,因为这里需要一个全局同步的时钟,于是Leslie Lamport提出了顺序一致性(Sequential consistency)的概念,这里全局的时钟变得不再需要,转而需要的是各个处理器局部的时钟,相应的,Maurice Herlihy和Nir Shavit等人后来又提出了静态一致性(Quiescent consistency)的概念。然而,即使是顺序一致性在实际系统中也是很少使用的,主要是它严格限制了程序的优化执行,强行的使程序在本地处理器上按程序序(program order)执行在大多数情况下是没有必要的。于是在后来的研究中陆续提出了面向硬件的内存模型(Hardware-centric memory model),其中包含了弱序一致性模型(WO, Weak-order model),处理器一致性模型(PC, Processor-consistency model),松弛一致性模型(RC, Release consistency model)以及一系列相关的派生模型,如TSO一致性模型(Total store ordering),PSO一致性模型(Partial Store Ordering)等。使用前面的这些模型对于程序员来说无疑是非常困惑的,因为这要求程序员在编写程序时必须考虑到各种硬件体系结构所对应的不同内存模型,于是后来的研究进一步提出了面向程序员的内存模型(Programmer-centric model)的概念,主要包括SCNF模型(Sequntial consistency nomal form)和PL模型(Properly-Labeled Model)等等。
常见模型线性一致性(Linearizability) 指的是程序在执行的历史中在存在可线性化点P的执行模型,这意味着一个操作将在程序的调用和返回之间的某个点P起作用。这里“起作用”的意思是被系统中并发运行的所有其他线程所感知。线性一致性最重要的性质就是其“局部性”(Local property, 或可组合性 - Compositional),即数个线性一致单对象历史的组合也是线性一致的。线性一致性的非阻塞性(Non-blocking property):线程P对完全操作(total function)的调用永远不会阻塞。
原子一致性(Atomic consistancy):读操作未能立即读到此前最近一次写操作的结果,但多读几次还是获得了正确结果。所有对数据的修改操作都是原子的,不会产生竞态冲突。
顺序一致性(Sequential consistency ):(并发程序在多处理器上的)任何一次执行结果都相同,就像所有处理器的操作按照某个顺序执行,各个微处理器的操作按照其程序指定的顺序进行。换句话说,所有的处理器以相同的顺序看到所有的修改。读操作未必能及时得到此前其他处理器对同一数据的写更新。但是各处理器读到的该数据的不同值的顺序是一致的。
缓存一致性(Cache coherence,或cache coherency),又译为缓存连贯性、缓存同调,是指保留在高速缓存中的共享资源,保持数据一致性的机制。在一个系统中,当许多不同的设备共享一个共同存储器资源,在高速缓存中的数据不一致,就会产生问题。这个问题在有数个CPU的多处理机系统中特别容易出现。缓存一致性可以分为三个层级:在进行每个写入运算时都立刻采取措施保证数据一致性;每个独立的运算,假如它造成数据值的改变,所有进程都可以看到一致的改变结果;在每次运算之后,不同的进程可能会看到不同的值。
处理器一致性(Processor consistency)/PRAM一致性(PRAM consistency,P指pipeline):在一个处理器上完成的所有写操作,将会被以它实际发生的顺序通知给所有其它的处理器;但是在不同处理器上完成的写操作也许会被其它处理器以不同于实际执行的顺序所看到。这反映了网络中不同节点的延迟可能是不相同的。对于双处理器,处理器一致性与顺序一致性是等价的。
本词条内容贡献者为:
李岳阳 - 副教授 - 江南大学