Memory Consistency Model 内存一致性模型

Memory Consistency Model 内存一致性模型

Conception 概念

内存一致性模型描述的是程序在执行过程中内存操作正确性的问题。

内存操作包括读操作和写操作,每一操作又可以用两个时间点界定:发出(Invoke)和响应(Response)。

在假定没有流水线的情况下(即单个处理器内指令的执行是按顺序执行的),设系统内共有N个处理器,每个处理器可发出 s_{n}_个内存操作(读或写),那么总共有:{\frac  {(\sum _{​{n=1}}^{​{n=N}}s_{n})!}{\prod _{​{n=1}}^{​{n=N}}s_{n}!}}种可能的执行顺序。

内存一致性模型描述的就是这些操作可能的执行顺序中那些是正确的。

for instance

Sequential Consistency (SC)

“program-order”

ptr = NULL; done = false

Producer
a: ptr = alloc( ) 1
b: done = true 2

Consumer
c: if (done) 3
d:r1 = ptr->x 4

上边两个进程,一个生产者进程,一个消费者线程,然后必须按照 代码片 后的数字顺序 执行。

History

按照传统冯诺依曼体系结构的计算模型来看,读操作应当返回最近的写操作所写入的结果,但是这里“最近”的含义是比较模糊的。因此必须将概念严格化,于是产生了线性一致性(或称做严格一致性Strict consistancy、原子一致性Atomic consistancy)的概念。但是线性一致性太难实现了,因为这里需要一个全局同步的时钟,于是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)等等。

Classification 分类

Linearizability or Strict Consistency 线性一致性 或者 严格一致性

任何对一个内存位置 X 的读操作,将返回 最近一次对该内存位置的写操作所写入的值。

Atomic Consistency 原子一致性

读操作未能立即读到此前最近一次写操作的结果,多读几次还是获得了正确结果,所有对数据的修改都是原子的,不会产生竞态冲突。

Sequential Consistency 顺序一致性

运行在多处理器上的并发程序,任何一次执行结果都相同,就像所有多处理器的操作都按照某个顺序执行,各个微处理器的操作按照其程序指定的顺序进行。

in other words,所有的处理器以相同的顺序看到所有的修改,eg,读操作未必能及时得到此前其他处理器对同一数据的写更新,但是各处理器读到的该数据的不同值的顺序是一致的。

Processor Consistency 处理器一致性/PRAM Consistency (Pipeline)

在一个处理器上完成的所有写操作,将会被以它实际发生的顺序通知给所有其它处理器,但是在不同处理器上完成的写操作也会被其它处理器以不同的实际执行顺序所看到。

这反映了网络中不同节点的延迟可能是不相同的。对于双处理器,处理器一致性和顺序一致性是等价的。

Release Consistency 释放一致性

在对一个共享变量进行普通访问之前,进程在之前所有的获得锁而进行的操作必须成功的完成。

在释放一个锁操作之前,进程之前的读和写必须已经完成。

获得 和 释放 锁 的操作必须符合“FIFO 一致性”。释放一致性 仅仅关注 被锁住的共享内存变量,只需要将对被锁住的共享变量的修改通知给其它处理器。 C#中的volatile write 函数 实现了 释放一致性的语义。

Weak-ordering Consistency 弱序一致性

  1. isca-90

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值