用記錄型信號量解決生產(chǎn)者-消費者問題

問題描述:

有一群生產(chǎn)者進程在生產(chǎn)產(chǎn)品,并將這些產(chǎn)品提供給消費者進程去消費。為使生產(chǎn)者進程與消費者進程能并發(fā)執(zhí)行,在兩者之間設(shè)置了一個具有n個緩沖區(qū)的緩沖池,生產(chǎn)者進程將其所生產(chǎn)的產(chǎn)品放入一個緩沖區(qū)中;消費者進程可從一個緩沖區(qū)中取走產(chǎn)品去消費。盡管所有的生產(chǎn)者進程和消費者進程都是以異步方式運行的,但它們之間必須保持同步,既不允許消費者進程到一個空緩沖區(qū)去取產(chǎn)品,也不允許生產(chǎn)者進程向一個已裝滿產(chǎn)品且尚未被取走的緩沖區(qū)投放產(chǎn)品。

參考代碼:

int in = 0, out = 0;//in: 輸入指針, out: 輸出指針;
item buffer[n];//n個緩沖區(qū)組成的數(shù)組;
semaphore mutex = 1, full = 0, empty = n;
//mutex: 互斥信號量, 生產(chǎn)者進程和消費者進程都只能互斥訪問緩沖區(qū);
//full: 資源信號量, 滿緩沖區(qū)的數(shù)量;
//empty: 資源信號量, 空緩沖區(qū)的數(shù)量;//信號量不允許直接參與運算, 故都要定義;

//生產(chǎn)者程序;
void Producer() {
  do {
      生產(chǎn)者生產(chǎn)一個產(chǎn)品nextp;
      wait(empty);//申請一個空緩沖區(qū);
      wait(mutex);//申請臨界資源;
      buffer[in] = nextp;//將產(chǎn)品添加到緩沖區(qū);
      in = (in + 1) % n;//類似于循環(huán)隊列;
      signal(mutex);//釋放臨界資源;
      signal(full);//釋放一個滿緩沖區(qū);
  } while (TRUE);
}

//消費者程序;
void Producer() {
  do {
      wait(full);//申請一個滿緩沖區(qū);
      wait(mutex);//申請臨界資源;
      nextc = buffer[out];//將產(chǎn)品從緩沖區(qū)取出;
      out = (out + 1) % n;//類似于循環(huán)隊列;
      signal(mutex);//釋放臨界資源;
      signal(empty);//釋放一個空緩沖區(qū);
      消費者將一個產(chǎn)品nextc消費; 
 } while (TRUE);
}

注意:

  1. 生產(chǎn)者與消費者進程對資源信號量的申請與釋放情況剛好相反(生產(chǎn)者是申請空,釋放滿;消費者是申請滿,釋放空)。
  2. 應(yīng)先執(zhí)行對資源信號量的申請,然后再對互斥信號量進行申請操作,否則會因起死鎖(如果先申請互斥信號量再申請資源信號量,則可能發(fā)生一個進程申請互斥信號量成功,得到臨界資源,再申請資源信號量失敗,導(dǎo)致該進程帶著臨界資源進入阻塞狀態(tài),造成死鎖)。

參考資料:《計算機操作系統(tǒng)(第四版)》(西安電子科技大學(xué)出版社)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章內(nèi)容: 生產(chǎn)者-消費者問題的模擬場景(代碼實現(xiàn)) 深入理解(信號量操作順序) 先把概念丟一邊,來一起下個館子吧...
    JABread閱讀 2,112評論 0 4
  • ** 本文摘自湯小丹主編《計算機操作系統(tǒng)》(第三版)2.3 進程同步 ** 在 OS 中引入進程后,雖然提高了資源...
    劉帥_閱讀 3,236評論 0 0
  • 背井離鄉(xiāng),離開熟悉的人和地方,去遠方生活,積攢起所有的力量去拼搏去吶喊,為了什么。有時候想想就讓人悲傷,有權(quán)有勢的...
    麥兜兜有糖閱讀 306評論 0 0
  • 1.漸變輪播,圖片淡入淡出 代碼預(yù)覽代碼 2.無限循環(huán)滾動輪播效果 代碼預(yù)覽代碼 3.全屏輪播(圖片大加載比較慢)...
    泰格_R閱讀 259評論 1 2
  • 在學(xué)習并觀察自己情緒的過程中,我逐漸梳理出自己在調(diào)整自我情緒中的幾個部分:覺察,觀察,思考和調(diào)頻。 覺察 覺察是指...
    不糊涂的小財迷閱讀 411評論 2 1

友情鏈接更多精彩內(nèi)容