問題描述:
有一群生產(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);
}
注意:
- 生產(chǎn)者與消費者進程對資源信號量的申請與釋放情況剛好相反(生產(chǎn)者是申請空,釋放滿;消費者是申請滿,釋放空)。
- 應(yīng)先執(zhí)行對資源信號量的申請,然后再對互斥信號量進行申請操作,否則會因起死鎖(如果先申請互斥信號量再申請資源信號量,則可能發(fā)生一個進程申請互斥信號量成功,得到臨界資源,再申請資源信號量失敗,導(dǎo)致該進程帶著臨界資源進入阻塞狀態(tài),造成死鎖)。
參考資料:《計算機操作系統(tǒng)(第四版)》(西安電子科技大學(xué)出版社)。