SC-DRF

本文参考了Sarita V. AdveMark D. HillWeak Ordering - A New Definition And Some Implications

一、顺序一致性(Sequential Consistency, SC)

顺序一致性最早是由Lamport定义的,其定义如下:

“… the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.”

需要注意的是定义中的the same as,说明顺序一致性模型并不是严格要求操作按顺序执行,而是只要求结果和某种按顺序执行的结果一样即可。

对于定义中的operation究竟指的是何种操作,Lamport没给出定义。对于一个共享内存的系统的内存模型,上述定义中的operation指的是内存读写操作。因此,对于一个共享内存的系统的内存模型,其顺序一致性的定义可以表达为:
(1) 所有的内存操作看起来都像原子的,并且按照某种顺序进行。
(2) 一个线程中的所有内存访问操作按程序声明的顺序 (program order)执行。

二、Weak Ordering

顺序一致性能给程序员很好的保证,我们在一个严格遵循顺序一致性内存模型的系统上编写代码将会变得很简单,很容易推断程序的结果。
但是,顺序一致性限制了编译器和硬件层面的很多优化措施。举个例子,现在很多处理器都使用store buffer,store buffer的使用可能会导致store/load重排序,从而违反了顺序一致性,但是store buffer的使用却能隐藏内存写操作的延迟,极大的提升速度,因此即使会导致内存重排序现象,现代大多数处理器也都会使用store buffer。

因此,人们提出了weak ordering的概念。它通过放松对程序中操作的顺序要求,来提供给编译器和硬件更多的优化空间,从而提高执行性能,这体现了是软件开发层面和编译器/硬件层面的trade-off。
一个weakly ordered的系统向程序员做出了这样的承诺只要程序遵守特定的限制(certain constraints),那么该程序就能呈现出顺序一致性的效果。

在一个weakly ordered的系统中,上述的限制通过同步操作(synchronization operations)实现,同步操作是硬件能够识别的操作,例如test_and_set, compare_and_swap等等。我们也称上述的限制同步模型(synchronized model)

下面给出weakly ordered的正式定义:

A system is weakly ordered with respect to a syschronization model iff it appears SC to all executions of a program that obey the synchronization model.

三、Data-Race-Free

一个同步模型通常需要声明它支持使用哪些同步原语来进行同步,根据同步模型的要求我们也可以判断当前的程序是否做了足够的同步,从而能满足顺序一致性。

Data-Race-Free(DRF)是同步模型(synchronizartion model)的一种,它可以用来辅助定义weakly ordered系统。但是,DRF对于它可以使用的同步原语没做限制,只要这些同步原语**能被硬件支持(recognized by the hardware)**即可,例如它可以是test_and_set。

有关同步原语的要求只是DRF的一个特征。DRF的另一个特征(feature)是,根据DRF我们能判断当前程序是否做了足够的同步。为了说明这一特征,我们下面介绍一个概念——程序中的happens-before关系
什么是happens-before关系:

A happens-before relation for a program is a partial order defined for an execution of the program on an abstract, idealized architecture, where all memory access are executed atomatically and in program order.

happens-before是一种严格偏序(strict partial order),它是针对程序的一次执行定义的顺序,该次执行满足所有的内存操作都是原子的,并且以程序顺序执行。对于这样一次执行,我们称不同处理器上的两个操作具有happens-before关系,仅当它们之间存在一个同步操作。

下面给出它的正式的定义,但是在给出之前,我们需要先介绍其他两个顺序,一个是程序顺序(program order) → p o \overset{po}{\rightarrow} po,一个是同步顺序(synchronization order) → s o \overset{so}{\rightarrow} so。假设 o p 1 op_1 op1, o p 2 op_2 op2是一次执行中任意两个内存操作,那么:

  • o p 1 → p o o p 2 op_1\overset{po}{\rightarrow}op_2 op1poop2 当且仅当 o p 1 op_1 op1 o p 2 op_2 op2属于同一个线程,且根据程序声明顺序 o p 1 op_1 op1 o p 2 op_2 op2前面
  • o p 1 → s o o p 2 op_1\overset{so}{\rightarrow}op_2 op1soop2 当且仅当 o p 1 op_1 op1 o p 2 op_2 op2同步操作,而且它们是针对同一个位置,并且 o p 1 op_1 op1早于 o p 2 op_2 op2完成

happens-before的正式定义:在一个idealized architecture上,happens-before关系可以定义为 → p o \overset{po}{\rightarrow} po → s o \overset{so}{\rightarrow} so非自反传递闭包(irreflexive transitive closure),即 → h b = ( → p o ∪ → s o ) + \overset{hb}{\rightarrow} = (\overset{po}{\rightarrow} \cup \overset{so}{\rightarrow})^+ hb=(poso)+

关于什么是传递闭包(transitive closure),参考:https://www.youtube.com/watch?v=OO8Jfs9uZnc

考虑下面的例子:
在这里插入图片描述
根据happens-before的定义,它是po和so的非自反传递闭包,因此有 o p ( P 1 , x ) → h b o p ( P 3 , x ) op(P_1,x) \overset{hb}\rightarrow op(P_3, x) op(P1,x)hbop(P3,x)

在给出happens-before的定义之后,我们就可以给DRF一个正式的定义了,DRF的正式定义如下:

一个程序遵循Data-Race-Free(DRF)同步模型,当且仅当:
(1) 所有的同步操作都可以由硬件支持(recognized by hardware)
(2) 在一个理想的系统上(内存操作都是原子的而且按程序顺序),所有的有冲突的内存操作都具有happens-before关系

上面定义中说的**冲突(conflict)**是指,两个内存操作针对同一地址,而且至少有一个是写操作。
在这里插入图片描述
以上图为例,图(a)遵循DRF;图(b)不遵循DRF,因为P0和P1存在对同一位置的变量x的读操作和写操作,P1: W(x), R(x), P2: W(x),但是P2的W(x)和P1的两个操作之间并没有happens-before关系,从而使得最后结果无法确定。同样图(b)的P2和P4也违反了DRF的定义。

三、SC-DRF

Java中的内存模型遵循SC-DRF,也就是如果进行了正确的同步,满足了DRF,那么程序看起来就像是顺序一致的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值