視頻鏈接:
https://www.bilibili.com/video/BV1YE411D7nH?p=22
一,問題描述:
1,系統中有一組生產者和消費者進程,生產者進程每次生產一個產品放入緩衝區,消費者進程每次從緩衝區中取出一個產品並使用(這裏的產品,可以理解爲某種數據),生產者和消費者需要共享一個初始爲空,大小爲N的緩衝區。
2,只有緩衝區沒滿時,生產者才能把產品放入緩衝區中,如果緩衝區滿了,就需要等待
3,只有緩衝區不爲空時,消費者才能從緩衝區取出產品。緩衝區爲空時等待,,緩衝區是臨界資源必須互斥的訪問
二,具體實現
1, 問題分析
緩衝區爲空時,生產者進程要在消費者進程之前——進程同步1
緩衝區爲滿時,生產者進程要在消費者進程之之後——進程同步2
生產者進程和消費者進程需要對緩衝區進行互斥的訪問——進程互斥
2,代碼表示
semaphore mutex=1; //互斥信號量,互斥的主體是多個生產者(消費者)進程之間,不是生產者和消費者之間的互斥
semaphore empty=n; //同步信號量1,代表緩衝區爲空的空間數,用來喚醒生產者進程,即緩衝區有空閒生產者進程可以生產
semaphore full=1; //同步信號量2,代表緩衝區被佔的空間數,用來喚醒消費者進程,即緩衝區有產品消費者進程就可以取走產品
/*
注意:先對實現同步的P操作,在實現互斥的P操作,這兩個操作順序不能交換
*/
//生產者進程
producter(){
while(1){
生成一個產品;
p(empty);//同步的P操作,緩衝有空閒時,可以執行下去
p(mutex);//互斥的P操作,多個生產者之間對緩衝區的訪問要互斥進行。防止數據被覆蓋
把產品放入到緩衝區中;
v(mutux);
v(full);
}
}
//消費者進程
consumer(){
while(1){
p(full);//同步的P操作,緩衝有產品時,可以執行下去
p(mutex);//互斥的P操作,多個消費者進程需要互斥訪問緩衝區,防止讀空的現象
從緩衝區中取出一個產品;
v(mutux);
v(empty);
使用產品;
}
}
三,解題思路:
1,關係分析。找出題目中描述的個進程,分析他們同步,互斥關係
2,整理思路,根據各個進程的操作流程確定P,V操作的大致順序
3,設置信號量,設置需要的信號量,並根據題目條件確定信號量的初值
4,注意,進入臨界區之前,先實現同步的P操作,再實現互斥的P操作