Peterson's Solution 算法 解決critial section 沖突問題

critical section 的情景如下富雅。多個(gè)程序會對共享的變量進(jìn)行操作由于對于變量的操作不是原子性的(不可分割,不能被中斷)就會造成數(shù)據(jù)的不一致肛搬。舉個(gè)例子没佑,例如你的銀行卡上有 100 塊錢,如果你同時(shí)在商家 A 與商家 B 同時(shí)消費(fèi) 100 元的東西温赔。如果記賬的過程不是原子性的蛤奢。商家需要先發(fā)請求到銀行用戶在這里想要消費(fèi)100元,銀行后臺程序需要看看用戶的賬戶里面是否錢是充足的,如果錢是充足的就批準(zhǔn)商家的消費(fèi)請求啤贩。由于計(jì)算機(jī)體系結(jié)構(gòu)的原因待秃,memory hierarchy,與操作系統(tǒng)的分時(shí)處理痹屹,如果沒有一定的同步措施章郁,數(shù)據(jù)不一致的情況。在加上現(xiàn)代的程序架構(gòu)會使用多線程志衍,多進(jìn)程的方式解決問題暖庄。會出現(xiàn)這樣的情況,商家 A B 同時(shí)發(fā)出請求楼肪,兩個(gè)子程序同時(shí)從數(shù)據(jù)庫中讀取到用戶賬號里面有 100 元培廓,因此同時(shí)批準(zhǔn)了這兩筆消費(fèi)〈航校總計(jì)消費(fèi)了 200 元肩钠,實(shí)時(shí)上用戶賬號只有 100 元,這時(shí)就會出現(xiàn)沖突象缀。

在單核的情況下蔬将,由于多線程多進(jìn)程是共享cpu計(jì)算時(shí)間爷速,程序 a 讀到賬號上有 100 元錢央星, 還沒進(jìn)行處理,操作系統(tǒng)讓 cpu 執(zhí)行 b惫东,b 也讀到用戶有 100 元莉给。此時(shí)操作系統(tǒng)讓 a 程序繼續(xù)執(zhí)行,并且扣除了用戶賬號上面的余額廉沮,之后操作系統(tǒng)讓程序b繼續(xù)執(zhí)行颓遏,由于此時(shí)程序b不會再去讀取用戶的賬戶所以這個(gè)程序也會批準(zhǔn)這個(gè)交易進(jìn)行。這樣用戶就會平白無故的賺了100元滞时。

如果是在多核或者是多服務(wù)器的情況下叁幢,由于 a,b程序可能會同時(shí)執(zhí)行曼玩,他們同時(shí)讀取到用戶的賬號上面有 100 元,并且同時(shí)批準(zhǔn)了交易篙梢。造成沖突的原因與單核情況下不太一致顷帖。

如果站在更高角度上看是由于不同程序間的數(shù)據(jù)同步問題造成的這一系列沖突榴嗅,不同程序修改的變量無法同步到不同的程序中。如果站在底層看就是由于 memory hierarchy 造成同一個(gè)數(shù)據(jù)會被放在不同地方论咏。盡管有緩存一致性協(xié)議厅贪,但是由于操作不是原子性的所以不同的程序不知道對方程序再干嘛所以會造成沖突。

這就是 critical section 的場景贯吓。

那么如何解決這樣的問題呢?一種方法是通過一定的機(jī)制使得在同一時(shí)間只有一個(gè)程序能夠?qū)τ脩舻馁~號進(jìn)程操作爬舰。Peterson's Solution 算法 就是一種在 單核并發(fā) 的解決方案。注意這里是單核垃你。

bool flag[2];
int turn;
// i process
do{
    flag[i] = true;
    turn = j;
    while(flag[j] && turn == j); // do nothing
    //critical section
    flag[i] = false;
    
}

// j process
do{
    flag[j] = true;
    turn = i;
    while(flag[i] && turn == i); // do nothing
    //critical section
    flag[j] = false;
    
}


fage[i] == true 時(shí),表示 程序 i 準(zhǔn)備進(jìn)入 critical section了官还,而 turn 則表示某個(gè)程序正在 critical section林说。那這個(gè)算法如何保證同時(shí)只有一個(gè)程序在critical section里面呢?這里有一個(gè)前提假設(shè)就是 load and write 是原子性的珠移。所以同一時(shí)刻,turn 要么是 i 要么是 j浓瞪。所以 如果兩個(gè)程序都是 ready 的,但是只有一個(gè)程序能夠進(jìn)入 critical section英岭,另一個(gè)程序會一直循環(huán)等待。在這里的 turn 變量的唯一性(不同程序讀到的都是一樣的)很重要荧库。

但是如果換到多核情況就會出現(xiàn)场刑, i 和 j 同時(shí)讀到 turn == i turn == j。此算法就會失效瞎疼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末太抓,一起剝皮案震驚了整個(gè)濱河市碴倾,隨后出現(xiàn)的幾起案子跌榔,更是在濱河造成了極大的恐慌,老刑警劉巖捶障,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矫户,死亡現(xiàn)場離奇詭異皆辽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扼菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧饮,“玉大人,你說我怎么就攤上這事帽撑∑酶鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弱贼。 經(jīng)常有香客問我蒸苇,道長,這世上最難降的妖魔是什么吮旅? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任溪烤,我火速辦了婚禮,結(jié)果婚禮上庇勃,老公的妹妹穿的比我還像新娘檬嘀。我一直安慰自己,他們只是感情好责嚷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布鸳兽。 她就那樣靜靜地躺著,像睡著了一般罕拂。 火紅的嫁衣襯著肌膚如雪揍异。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天爆班,我揣著相機(jī)與錄音衷掷,去河邊找鬼。 笑死柿菩,一個(gè)胖子當(dāng)著我的面吹牛戚嗅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枢舶,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懦胞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凉泄?” 一聲冷哼從身側(cè)響起躏尉,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旧困,沒想到半個(gè)月后醇份,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吼具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矩距。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗盒。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锥债,靈堂內(nèi)的尸體忽然破棺而出陡蝇,到底是詐尸還是另有隱情痊臭,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布登夫,位于F島的核電站广匙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恼策。R本人自食惡果不足惜鸦致,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涣楷。 院中可真熱鬧分唾,春花似錦、人聲如沸狮斗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碳褒。三九已至折砸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沙峻,已是汗流浹背鞍爱。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专酗,地道東北人睹逃。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像祷肯,于是被迫代替她去往敵國和親沉填。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,992評論 0 13
  • 一佑笋、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 用筆記本寫下以下三類工作內(nèi)容 1.每天反復(fù)做的 2.當(dāng)天重要任務(wù) 3.代辦事情 下載“小目標(biāo)”App翼闹,將任務(wù)分解到...
    陳劭閱讀 232評論 0 2
  • 一片荒原上,晚宴剛剛開始蒋纬。 我沒吃東西猎荠,也沒有喝水。在晚宴開始不久我離開座位蜀备,走向遠(yuǎn)處的那幢灰黑色的樓房关摇。 樓房矗...
    黑桃三層閱讀 282評論 0 0