(轉(zhuǎn))【OS】進(jìn)程同步:讀者-寫(xiě)者問(wèn)題

問(wèn)題描述

有讀者和寫(xiě)者兩組并發(fā)進(jìn)程,共享一個(gè)文件根资,當(dāng)兩個(gè)或以上的讀進(jìn)程同時(shí)訪問(wèn)共享數(shù)據(jù)時(shí)不會(huì)產(chǎn)生副作用架专,但若某個(gè)寫(xiě)進(jìn)程和其他進(jìn)程(讀進(jìn)程或?qū)戇M(jìn)程)同時(shí)訪問(wèn)共享數(shù)據(jù)時(shí)則可能導(dǎo)致數(shù)據(jù)不一致的錯(cuò)誤。因此要求:①允許多個(gè)讀者可以同時(shí)對(duì)文件執(zhí)行讀操作玄帕;②只允許一個(gè)寫(xiě)者往文件中寫(xiě)信息部脚;③任一寫(xiě)者在完成寫(xiě)操作之前不允許其他讀者或?qū)懻吖ぷ鳎虎軐?xiě)者執(zhí)行寫(xiě)操作前裤纹,應(yīng)讓已有的讀者和寫(xiě)者全部退出委刘。

問(wèn)題分析

    1. 關(guān)系分析。由題目分析讀者和寫(xiě)者是互斥的鹰椒,寫(xiě)者和寫(xiě)者也是互斥的锡移,而讀者和讀者不存在互斥問(wèn)題。
    1. 整理思路漆际。兩個(gè)進(jìn)程淆珊,即讀者和寫(xiě)者。寫(xiě)者是比較簡(jiǎn)單的奸汇,它和任何進(jìn)程互斥施符,用互斥信號(hào)量的P操作、V操作即可解決茫蛹。讀者的問(wèn)題比較復(fù)雜操刀,它必須實(shí)現(xiàn)與寫(xiě)者互斥的同時(shí)還要實(shí)現(xiàn)與其他讀者的同步,因此婴洼,僅僅簡(jiǎn)單的一對(duì)P操作骨坑、V操作是無(wú)法解決的。那么柬采,在這里用到了一個(gè)計(jì)數(shù)器欢唾,用它來(lái)判斷當(dāng)前是否有讀者讀文件。當(dāng)有讀者的時(shí)候?qū)懻呤菬o(wú)法寫(xiě)文件的粉捻,此時(shí)讀者會(huì)一直占用文件礁遣,當(dāng)沒(méi)有讀者的時(shí)候?qū)懻卟趴梢詫?xiě)文件。同時(shí)這里不同讀者對(duì)計(jì)數(shù)器的訪問(wèn)也應(yīng)該是互斥的肩刃。
    1. 信號(hào)量設(shè)置祟霍。首先設(shè)置信號(hào)量count為計(jì)數(shù)器,用來(lái)記錄當(dāng)前讀者數(shù)量盈包,初值為0; 設(shè)置mutex為互斥信號(hào)量沸呐,用于保護(hù)更新count變量時(shí)的互斥;設(shè)置互斥信號(hào)量rw用于保證讀者和寫(xiě)者的互斥訪問(wèn)呢燥。

代碼如下:

int count=0;  //用于記錄當(dāng)前的讀者數(shù)量
semaphore mutex=1;  //用于保護(hù)更新count變量時(shí)的互斥
semaphore rw=1;  //用于保證讀者和寫(xiě)者互斥地訪問(wèn)文件
writer () {  //寫(xiě)者進(jìn)程
   while (1){
       P(rw); // 互斥訪問(wèn)共享文件
       Writing;  //寫(xiě)入
       V(rw) ;  //釋放共享文件
   }
}
reader () {  // 讀者進(jìn)程
   while(1){
       P (mutex) ;  //互斥訪問(wèn)count變量
       if (count==0)  //當(dāng)?shù)谝粋€(gè)讀進(jìn)程讀共享文件時(shí)
           P(rw);  //阻止寫(xiě)進(jìn)程寫(xiě)
       count++;  //讀者計(jì)數(shù)器加1
       V (mutex) ;  //釋放互斥變量count
       reading;  //讀取
       P (mutex) ;  //互斥訪問(wèn)count變量
       count--; //讀者計(jì)數(shù)器減1
       if (count==0)  //當(dāng)最后一個(gè)讀進(jìn)程讀完共享文件
           V(rw) ;  //允許寫(xiě)進(jìn)程寫(xiě)
       V (mutex) ;  //釋放互斥變量 count
   }
}

在上面的算法中崭添,讀進(jìn)程是優(yōu)先的,也就是說(shuō)叛氨,當(dāng)存在讀進(jìn)程時(shí)呼渣,寫(xiě)操作將被延遲棘伴,并且只要有一個(gè)讀進(jìn)程活躍,隨后而來(lái)的讀進(jìn)程都將被允許訪問(wèn)文件屁置。這樣的方式下焊夸,會(huì)導(dǎo)致寫(xiě)進(jìn)程可能長(zhǎng)時(shí)間等待,且存在寫(xiě)進(jìn)程“餓死”的情況缰犁。

如果希望寫(xiě)進(jìn)程優(yōu)先淳地,即當(dāng)有讀進(jìn)程正在讀共享文件時(shí),有寫(xiě)進(jìn)程請(qǐng)求訪問(wèn)帅容,這時(shí)應(yīng)禁止后續(xù)讀進(jìn)程的請(qǐng)求,等待到已在共享文件的讀進(jìn)程執(zhí)行完畢則立即讓寫(xiě)進(jìn)程執(zhí)行伍伤,只有在無(wú)寫(xiě)進(jìn)程執(zhí)行的情況下才允許讀進(jìn)程再次運(yùn)行并徘。為此,增加一個(gè)信號(hào)量并且在上面的程序中 writer()和reader()函數(shù)中各增加一對(duì)PV操作扰魂,就可以得到寫(xiě)進(jìn)程優(yōu)先的解決程序麦乞。

int count = 0;  //用于記錄當(dāng)前的讀者數(shù)量
semaphore mutex = 1;  //用于保護(hù)更新count變量時(shí)的互斥
semaphore rw=1;  //用于保證讀者和寫(xiě)者互斥地訪問(wèn)文件
semaphore w=1;  //用于實(shí)現(xiàn)“寫(xiě)優(yōu)先”
writer(){
    while(1){
        P(w);  //在無(wú)寫(xiě)進(jìn)程請(qǐng)求時(shí)進(jìn)入
        P(rw);  //互斥訪問(wèn)共享文件
        writing;  //寫(xiě)入
        V(rw);  // 釋放共享文件
        V(w) ;  //恢復(fù)對(duì)共享支件的訪問(wèn)
    }
}
reader () {  //讀者進(jìn)程
    while (1){
        P (w) ;  // 在無(wú)寫(xiě)進(jìn)程請(qǐng)求時(shí)進(jìn)入
        P (mutex);  // 互斥訪問(wèn)count變量
        if (count==0)  //當(dāng)?shù)谝粋€(gè)讀進(jìn)程讀共享文件時(shí)
            P(rw);  //阻止寫(xiě)進(jìn)程寫(xiě)
        count++;  //讀者計(jì)數(shù)器加1
        V (mutex) ;  //釋放互斥變量count
        V(w);  //恢復(fù)對(duì)共享文件的訪問(wèn)
        reading;  //讀取
        P (mutex) ; //互斥訪問(wèn)count變量
        count--;  //讀者計(jì)數(shù)器減1
        if (count==0)  //當(dāng)最后一個(gè)讀進(jìn)程讀完共享文件
            V(rw);  //允許寫(xiě)進(jìn)程寫(xiě)
        V (mutex);  //釋放互斥變量count
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劝评,隨后出現(xiàn)的幾起案子姐直,更是在濱河造成了極大的恐慌,老刑警劉巖蒋畜,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声畏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姻成,警方通過(guò)查閱死者的電腦和手機(jī)插龄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)科展,“玉大人均牢,你說(shuō)我怎么就攤上這事〔哦茫” “怎么了徘跪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)琅攘。 經(jīng)常有香客問(wèn)我垮庐,道長(zhǎng),這世上最難降的妖魔是什么乎澄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任突硝,我火速辦了婚禮,結(jié)果婚禮上置济,老公的妹妹穿的比我還像新娘解恰。我一直安慰自己锋八,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布护盈。 她就那樣靜靜地躺著挟纱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腐宋。 梳的紋絲不亂的頭發(fā)上紊服,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音胸竞,去河邊找鬼欺嗤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卫枝,可吹牛的內(nèi)容都是我干的煎饼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼校赤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吆玖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起马篮,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沾乘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后浑测,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翅阵,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年尽爆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怎顾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漱贱,死狀恐怖槐雾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幅狮,我是刑警寧澤募强,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站崇摄,受9級(jí)特大地震影響擎值,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逐抑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一鸠儿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦进每、人聲如沸汹粤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘱兼。三九已至,卻和暖如春贤徒,著一層夾襖步出監(jiān)牢的瞬間芹壕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工接奈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踢涌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓鲫趁,卻偏偏與公主長(zhǎng)得像斯嚎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挨厚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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