43、現有3個生產者P1、P2、P3,他們都要生產橘子汁,每個生產者都已分別購得兩種不同的原料,待購齊第三種原料后就可配制成橘子汁裝瓶出售。有一供應商能源源不斷的供應糖、水、橘子精,但每次只拿出一種原料放入容器中供應給生產者。當容器中有原料時,需要這種原料的生產者可以取走,當容器空時供應商又可放入一種原料。假定:生產者p1已購得糖和水;生產者P2已購得水和橘子精; 生產者P3已購得糖和橘子精; 試用: (1)管程(2)信號量和P、V操作寫出供應商和3個生產者之間能正確同步的程序。
Cemaphore empty=1;
橘子精=0;糖=0;水=0;
Process product(){
While(true){
P(empty);
產生一個隨機數s;
If(s==0) V(橘子精);
If(s==1) V(水);
If(s==2) V(糖);
}
}
Process P1(){
Process P2(){
Process P3(){
While(true){
while(true){
while(true){
P(橘子精);
P(糖);
P(水);
取走橘子精;
取走糖;
取走水;
V(empty);
V(empty);
V(empty);
}
}
}
}
}
}
Coend
2.IPO問題:有多個輸入進程、多個處理進程和多個輸出進程。輸入進程把數據逐步輸入到一個有M個單位緩沖區B1上,經處理進程處理之后放到有N個單位的緩沖區B2上,由輸出進程進行輸出。
a.這個問題有哪些進程?進程之間有什么樣的制約關系?
b.用信號量及PV操作寫出這些進程之間的同步算法
解:
a:有輸入進程、處理進程、輸出進程,進程之間有同步關系。
b: semaphore B1;B1=M; /*B1可用的空緩存區*/
semaphore B2;B2=N; /*B2可用的空緩存區*/
semaphore mutex;mutex=1; /*同步信號*/
cobegin
process input(){
while(true){
p(mutex);
輸入;
B1--;
v(mutex);
}
}
process chuli(){
while(true){
p(mutex);
處理;
B1++;
B2--;
v(mutex);
}
}
process output(){
while(true){
p(mutex);
輸出;
B2++;
v(mutex);
}
}
coend