信號(hào)量與進(jìn)程/線程間同步與互斥

術(shù)語

  • 進(jìn)度圖 進(jìn)度圖是將 n 個(gè)并發(fā)進(jìn)程的執(zhí)行模型化為一條 n 維笛卡爾空間中的軌跡線魄衅,每條軸 k 對(duì)應(yīng)于線程 k 的進(jìn)度峭竣,每個(gè)進(jìn)度對(duì)應(yīng)一條指令。
  • 臨界區(qū) 某個(gè)線程操作共享變量 cnt 內(nèi)容的一串指令
  • 不安全區(qū) 兩個(gè)臨界區(qū)的交集形成的狀態(tài)空間區(qū)域稱為不安全區(qū)
  • 安全軌跡區(qū) 繞開不安全區(qū)的軌跡線
  • 信號(hào)量 是一個(gè)具有非負(fù)整數(shù)值的全局變量晃虫,只能由兩種特殊的操作 P(s)(測(cè)試減一) 和 V(s)(增加加一) 來處理皆撩,這兩個(gè)操作都是原子的,不可分割的
    臨界區(qū)與安全軌跡線

    為了保證線程化程序的正確執(zhí)行(實(shí)際上是任何共享全局?jǐn)?shù)據(jù)結(jié)構(gòu)的冰法程序的正確執(zhí)行)我們必須以某種方式同步線程哲银,使它們總是有一條安全軌跡線扛吞,一個(gè)經(jīng)典的方法是基于信號(hào)量的思想。

使用信號(hào)量來實(shí)現(xiàn)互斥

基本思想是將每個(gè)共享變量與一個(gè)信號(hào)量 s(初始化為一個(gè)整數(shù) n) 聯(lián)系起來盘榨,然后用 P(s) 和 V(s) 操作將相應(yīng)的臨界區(qū)包圍起來喻粹。
s 的初始值決定了這個(gè)資源可以同時(shí)被 n 個(gè)進(jìn)程使用
n=1 時(shí)的信號(hào)量成為互斥鎖(mutex),P(s) 和 V(s)相應(yīng)的成為加鎖和解鎖草巡,信號(hào)量操作確保了對(duì)臨界區(qū)的互斥訪問守呜。

使用信號(hào)量實(shí)現(xiàn)互斥

使用信號(hào)量來調(diào)度共享資源

除了提供互斥之外,信號(hào)量的另外一個(gè)重要作用是用來調(diào)度對(duì)共享資源的訪問山憨,即一個(gè)線程用信號(hào)量來通知另一個(gè)線程查乒,線程狀態(tài)中的某個(gè)條件已經(jīng)為真了。

生產(chǎn)者-消費(fèi)者問題

生產(chǎn)者消費(fèi)者問題也稱為有限緩沖問題郁竟,是一個(gè)多線程同步問題的經(jīng)典案例玛迄。該問題描述了共享固定大小緩沖區(qū)的兩個(gè)線程——即所謂的“生產(chǎn)者”和“消費(fèi)者”——在實(shí)際運(yùn)行時(shí)會(huì)發(fā)生的問題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中棚亩,然后重復(fù)此過程蓖议。與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)讥蟆。該問題的關(guān)鍵就是要保證生產(chǎn)者不會(huì)在緩沖區(qū)滿時(shí)加入數(shù)據(jù)勒虾,消費(fèi)者也不會(huì)在緩沖區(qū)中空時(shí)消耗數(shù)據(jù)。
要解決該問題瘸彤,就必須讓生產(chǎn)者在緩沖區(qū)滿時(shí)休眠(要么干脆就放棄數(shù)據(jù))捌归,等到下次消費(fèi)者消耗緩沖區(qū)中的數(shù)據(jù)的時(shí)候润梯,生產(chǎn)者才能被喚醒议经,開始往緩沖區(qū)添加數(shù)據(jù)。同樣玻靡,也可以讓消費(fèi)者在緩沖區(qū)空時(shí)進(jìn)入休眠,等到生產(chǎn)者往緩沖區(qū)添加數(shù)據(jù)之后中贝。
經(jīng)典進(jìn)程同步問題1:生產(chǎn)者-消費(fèi)者問題

semaphore mutex=1; //臨界區(qū)互斥信號(hào)量
semaphore empty=n;  //空閑緩沖區(qū)
semaphore full=0;  //緩沖區(qū)初始化為空
producer () { //生產(chǎn)者進(jìn)程
   while(1){
       produce an item in nextp;  //生產(chǎn)數(shù)據(jù)
       P(empty);  //獲取空緩沖區(qū)單元
       P(mutex);  //進(jìn)入臨界區(qū).
       add nextp to buffer;  //將數(shù)據(jù)放入緩沖區(qū)
       V(mutex);  //離開臨界區(qū),釋放互斥信號(hào)量
       V(full);  //滿緩沖區(qū)數(shù)加1
   }
}
consumer () {  //消費(fèi)者進(jìn)程
   while(1){
       P(full);  //獲取滿緩沖區(qū)單元
       P(mutex);  // 進(jìn)入臨界區(qū)
       remove an item from buffer;  //從緩沖區(qū)中取出數(shù)據(jù)
       V (mutex);  //離開臨界區(qū)囤捻,釋放互斥信號(hào)量
       V (empty) ;  //空緩沖區(qū)數(shù)加1
       consume the item;  //消費(fèi)數(shù)據(jù)
   }
}

讀者寫者問題

有讀者和寫者兩組并發(fā)進(jìn)程,共享一個(gè)文件雄妥,當(dāng)兩個(gè)或以上的讀進(jìn)程同時(shí)訪問共享數(shù)據(jù)時(shí)不會(huì)產(chǎn)生副作用最蕾,但若某個(gè)寫進(jìn)程和其他進(jìn)程(讀進(jìn)程或?qū)戇M(jìn)程)同時(shí)訪問共享數(shù)據(jù)時(shí)則可能導(dǎo)致數(shù)據(jù)不一致的錯(cuò)誤依溯。因此要求:①允許多個(gè)讀者可以同時(shí)對(duì)文件執(zhí)行讀操作老厌;②只允許一個(gè)寫者往文件中寫信息;③任一寫者在完成寫操作之前不允許其他讀者或?qū)懻吖ぷ骼杪虎軐懻邎?zhí)行寫操作前枝秤,應(yīng)讓已有的讀者和寫者全部退出。
經(jīng)典進(jìn)程同步問題2:讀者-寫者問題

int count = 0;  //用于記錄當(dāng)前的讀者數(shù)量
semaphore mutex = 1;  //用于保護(hù)更新count變量時(shí)的互斥
semaphore rw=1;  //用于保證讀者和寫者互斥地訪問文件
semaphore w=1;  //用于實(shí)現(xiàn)“寫優(yōu)先”
writer(){
    while(1){
        P(w);  //在無寫進(jìn)程請(qǐng)求時(shí)進(jìn)入
        P(rw);  //互斥訪問共享文件
        writing;  //寫入
        V(rw);  // 釋放共享文件
        V(w) ;  //恢復(fù)對(duì)共享支件的訪問
    }
}
reader () {  //讀者進(jìn)程
    while (1){
        P (w) ;  // 在無寫進(jìn)程請(qǐng)求時(shí)進(jìn)入
        P (mutex);  // 互斥訪問count變量
        if (count==0)  //當(dāng)?shù)谝粋€(gè)讀進(jìn)程讀共享文件時(shí)
            P(rw);  //阻止寫進(jìn)程寫
        count++;  //讀者計(jì)數(shù)器加1
        V (mutex) ;  //釋放互斥變量count
        V(w);  //恢復(fù)對(duì)共享文件的訪問
        reading;  //讀取
        P (mutex) ; //互斥訪問count變量
        count--;  //讀者計(jì)數(shù)器減1
        if (count==0)  //當(dāng)最后一個(gè)讀進(jìn)程讀完共享文件
            V(rw);  //允許寫進(jìn)程寫
        V (mutex);  //釋放互斥變量count
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慷嗜,一起剝皮案震驚了整個(gè)濱河市淀弹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庆械,老刑警劉巖薇溃,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缭乘,居然都是意外死亡沐序,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門堕绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來策幼,“玉大人,你說我怎么就攤上這事奴紧√亟悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵黍氮,是天一觀的道長(zhǎng)唐含。 經(jīng)常有香客問我,道長(zhǎng)沫浆,這世上最難降的妖魔是什么捷枯? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮件缸,結(jié)果婚禮上铜靶,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好争剿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布已艰。 她就那樣靜靜地躺著,像睡著了一般蚕苇。 火紅的嫁衣襯著肌膚如雪哩掺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天涩笤,我揣著相機(jī)與錄音嚼吞,去河邊找鬼。 笑死蹬碧,一個(gè)胖子當(dāng)著我的面吹牛舱禽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恩沽,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼誊稚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了罗心?” 一聲冷哼從身側(cè)響起里伯,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤闷,沒想到半個(gè)月后疾瓮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒箭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年狼电,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片补憾。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漫萄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盈匾,到底是詐尸還是另有隱情腾务,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布削饵,位于F島的核電站岩瘦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窿撬。R本人自食惡果不足惜启昧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劈伴。 院中可真熱鬧密末,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刹碾,卻和暖如春燥撞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迷帜。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工物舒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戏锹。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓冠胯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親景用。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涵叮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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