順序一致性

  1. 來自Leslie Lamport的經(jīng)典論文《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】只有兩個進程的互斥協(xié)議

process 1 :
  a = 1; //1
  if (b == 0) {//2
    // 進入臨界區(qū)域
    a = 0;
    // 退出臨界區(qū)域
  }else {
    // 執(zhí)行其他操作
  }
process 2 :  
  b = 1;//3
  if (a == 0) {//4
    // 進入臨界區(qū)域
    b = 0;
    // 退出臨界區(qū)域
  }else {
    // 執(zhí)行其他操作
  }

分析:
如果process 1先執(zhí)行if(b==0)或者process 2先執(zhí)行if (a==0),即存在一個進程的執(zhí)行順序和定義順序不一致(可能是由于編譯器或者處理器的優(yōu)化措施導(dǎo)致)兄裂,就有可能導(dǎo)致兩個進程同時進入臨界區(qū)域检碗,從出現(xiàn)錯誤。因此必須要求:從單個進程來看询一,每個處理器的執(zhí)行順序必須和定義順序一致,從而就禁止了編譯器或者處理器的優(yōu)化措施爆存。

從上述要求1株扛,可以得出下面兩個有用的推論:

  1. 從全局的角度养距,每個CPU看到的其他CPU的寫操作都是按照相同的順序執(zhí)行的诉探,看到的最終執(zhí)行的視圖是一致的;
  2. 單個CPU對共享變量的寫操作馬上對其他CPU可見
    證明:假設(shè)單個CPU對共享變量的寫操作不是馬上對其他CPU可見的棍厌,即在當前線程把寫過的數(shù)據(jù)緩存在本地內(nèi)存中肾胯,且還沒有刷新到主內(nèi)存之前,這個寫操作僅對當前線程可見耘纱;從其他線程的角度來觀察敬肚,會認為這個寫操作根本還沒有被當前線程執(zhí)行。只有當前線程把本地內(nèi)存中寫過的數(shù)據(jù)刷新到主內(nèi)存之后束析,這個寫操作才能對其他線程可見艳馒。在這種情況下,當前線程和其它線程看到的操作執(zhí)行順序?qū)⒉灰恢禄福瑥亩`反推論1鹰溜。

【案例2】假設(shè)每個內(nèi)存模塊都有多個端口虽填,一個端口服務(wù)一個處理器丁恭。假設(shè)ab被存儲在不同的內(nèi)存模塊中,現(xiàn)在發(fā)生了以下事件:

  1. 處理器1向內(nèi)存塊1上專用于服務(wù)處理器1的端口發(fā)送a=1的請求斋日。但是內(nèi)存塊1正忙于執(zhí)行其他處理器的操作牲览;

  2. 處理器1向內(nèi)存塊2上專用于服務(wù)處理器1的端口發(fā)送fetch b的請求。內(nèi)存2是空閑的恶守,則開始執(zhí)行第献,進入臨界區(qū);

  3. 處理器2向內(nèi)存塊2上專用于服務(wù)處理器2的端口發(fā)送b=1的請求兔港。這個請求在處理器1的fetch b完成后開始執(zhí)行庸毫;

4)處理器2向內(nèi)存塊1上專用于服務(wù)處理器2的端口發(fā)送fetch a的請求。此時內(nèi)存塊1還忙于執(zhí)行其他處理器的操作衫樊;

現(xiàn)在有兩個操作等著被內(nèi)存塊2執(zhí)行飒赃,如果處理器2的fetch a請求先被執(zhí)行,則同時有兩個進程進入臨界區(qū)域科侈。進而有第二個要求:

單個內(nèi)存塊必須按照先來先服務(wù)的規(guī)則來處理來自多個處理器的所有請求载佳。

  1. 來自Java1.7語言規(guī)范里的[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. 《聊聊高并發(fā)(三十三)Java內(nèi)存模型那些事(一)從一致性(Consistency)的角度理解Java內(nèi)存模型》http://blog.csdn.net/iter_zc/article/details/41943387
  3. 《深入理解Java內(nèi)存模型(三)——順序一致性》http://www.infoq.com/cn/articles/java-memory-model-3
  4. 《為什么程序員需要關(guān)心順序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence?)》
    http://www.infoq.com/cn/articles/java-memory-model-3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臀栈,一起剝皮案震驚了整個濱河市蔫慧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌权薯,老刑警劉巖姑躲,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睡扬,死亡現(xiàn)場離奇詭異,居然都是意外死亡黍析,警方通過查閱死者的電腦和手機威蕉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄仍,“玉大人韧涨,你說我怎么就攤上這事∥攴保” “怎么了虑粥?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宪哩。 經(jīng)常有香客問我娩贷,道長,這世上最難降的妖魔是什么锁孟? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任彬祖,我火速辦了婚禮,結(jié)果婚禮上品抽,老公的妹妹穿的比我還像新娘储笑。我一直安慰自己,他們只是感情好圆恤,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布突倍。 她就那樣靜靜地躺著,像睡著了一般盆昙。 火紅的嫁衣襯著肌膚如雪羽历。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天淡喜,我揣著相機與錄音秕磷,去河邊找鬼。 笑死炼团,一個胖子當著我的面吹牛澎嚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播们镜,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼币叹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了模狭?” 一聲冷哼從身側(cè)響起颈抚,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贩汉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱富,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年匹舞,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐鸥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡赐稽,死狀恐怖叫榕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姊舵,我是刑警寧澤晰绎,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站括丁,受9級特大地震影響荞下,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜史飞,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一尖昏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧构资,春花似錦抽诉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塞帐。三九已至拦赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葵姥,已是汗流浹背荷鼠。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榔幸,地道東北人允乐。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像削咆,于是被迫代替她去往敵國和親牍疏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在鋼琴面前的時間呆的太長了拨齐,總是會有幾分倦怠鳞陨,就如同在書本面前咀嚼久了,難免會迂腐瞻惋。 都不知道要寫一些什么厦滤,只知道...
    永遠的大腳閱讀 217評論 5 1
  • 選擇的學習資料是《賴世雄美語發(fā)音從頭學》援岩,看了《把英語用起來》這本書之后一直躍躍欲試,只是對于結(jié)果的專注與檢視都...
    申小艷閱讀 199評論 0 0
  • 做銷售只需要管理好自己就可以了掏导,做團隊的要求就更高了享怀,需要管理好人。人是這個世界上最復(fù)雜的動物趟咆。我們先要了解人添瓷,才...
    kenkencan閱讀 167評論 0 0
  • 1、首先準備工具:jdk(環(huán)境變量)值纱、tomcat仰坦、eclipse(壓縮版)、mysql计雌、navicat(mysq...
    blueskylxb閱讀 665評論 0 3