顺序一致性

  1. 来自Leslie Lamport的经典论文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》:

" Consider a computer composed of several such processors accessing a common memory. The customary approach to designing and proving the correctness of multiprocess algorithms for such a computer assumes that the following condition is satisfied : 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 individula processor appear in this sequence in the order specified by its program. A multiprocessor satisfying this condition will be called sequentially consistent." --- LESLIE LAMPORT

【案例1】只有两个进程的互斥协议

process 1 :
  a = 1; //1
  if (b == 0) {//2
    // 进入临界区域
    a = 0;
    // 退出临界区域
  }else {
    // 执行其他操作
  }
process 2 :  
  b = 1;//3
  if (a == 0) {//4
    // 进入临界区域
    b = 0;
    // 退出临界区域
  }else {
    // 执行其他操作
  }

分析:
如果process 1先执行if(b==0)或者process 2先执行if (a==0),即存在一个进程的执行顺序和定义顺序不一致(可能是由于编译器或者处理器的优化措施导致),就有可能导致两个进程同时进入临界区域,从出现错误。因此必须要求:从单个进程来看,每个处理器的执行顺序必须和定义顺序一致,从而就禁止了编译器或者处理器的优化措施。

从上述要求1,可以得出下面两个有用的推论:

  1. 从全局的角度,每个CPU看到的其他CPU的写操作都是按照相同的顺序执行的,看到的最终执行的视图是一致的;
  2. 单个CPU对共享变量的写操作马上对其他CPU可见
    证明:假设单个CPU对共享变量的写操作不是马上对其他CPU可见的,即在当前线程把写过的数据缓存在本地内存中,且还没有刷新到主内存之前,这个写操作仅对当前线程可见;从其他线程的角度来观察,会认为这个写操作根本还没有被当前线程执行。只有当前线程把本地内存中写过的数据刷新到主内存之后,这个写操作才能对其他线程可见。在这种情况下,当前线程和其它线程看到的操作执行顺序将不一致,从而违反推论1。

【案例2】假设每个内存模块都有多个端口,一个端口服务一个处理器。假设ab被存储在不同的内存模块中,现在发生了以下事件:

  1. 处理器1向内存块1上专用于服务处理器1的端口发送a=1的请求。但是内存块1正忙于执行其他处理器的操作;

  2. 处理器1向内存块2上专用于服务处理器1的端口发送fetch b的请求。内存2是空闲的,则开始执行,进入临界区;

  3. 处理器2向内存块2上专用于服务处理器2的端口发送b=1的请求。这个请求在处理器1的fetch b完成后开始执行;

4)处理器2向内存块1上专用于服务处理器2的端口发送fetch a的请求。此时内存块1还忙于执行其他处理器的操作;

现在有两个操作等着被内存块2执行,如果处理器2的fetch a请求先被执行,则同时有两个进程进入临界区域。进而有第二个要求:

单个内存块必须按照先来先服务的规则来处理来自多个处理器的所有请求。

  1. 来自Java1.7语言规范里的[https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5](Java Memory Model)里的定义:

    A set of actions is sequentially consistent if all actions occur in a total order (the execution order) that is consistent with program order, and furthermore, each read r of a variable v sees the value written by the write w to v such that:

    • w comes before r in the execution order, and
    • there is no other write w' such that w comes before w' and w' comes before r in the execution order.

    Sequential consistency is a very strong guarantee that is made about visibility and ordering in an execution of a program. Within a sequentially consistent execution, there is a total order over all individual actions (such as reads and writes) which is consistent with the order of the program, and each individual action is atomic and is immediately visible to every thread.

    If a program has no data races, then all executions of the program will appear to be sequentially consistent.

    Sequential consistency and/or freedom from data races still allows errors arising from groups of operations that need to be perceived atomically and are not.

    If we were to use sequential consistency as our memory model, many of the compiler and processor optimizations that we have discussed would be illegal.

【参考资料】

  1. https://www.microsoft.com/en-us/research/wp-content/uploads/2016/12/How-to-Make-a-Multiprocessor-Computer-That-Correctly-Executes-Multiprocess-Programs.pdf
  2. 《聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型》http://blog.csdn.net/iter_zc/article/details/41943387
  3. 《深入理解Java内存模型(三)——顺序一致性》http://www.infoq.com/cn/articles/java-memory-model-3
  4. 《为什么程序员需要关心顺序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence?)》
    http://www.infoq.com/cn/articles/java-memory-model-3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容