进程同步补充补充练习
例1.生产围棋的工人不小心把相等数量的黑子和白子混装在一个箱子里,现要用自动分拣系统把白子黑子分开,该系统由两个并发执行的进程组成,功能如下:
1)进程A专拣黑子,进程B专拣白子
2)每个进程每次只拣一个子,当一个进程拣子时不允许另一个去拣子。
分析:1)进程关系分析:
互斥
2)信号量:
1个信号量
算法实现:
begin
s:semaphore:=1;
parbegin
process A
begin
repeat
…
wait(s);
拣黑子;
signal(s);
…
until false
end
process B
begin
repeat
…
wait(s);
拣白子;
signal(s);
…
until false
end
parend
end
题目改进:若题目改为当一个进程拣了棋子后必须让另一个进程拣一个棋子。
分析:
此时两进程关系为同步,需要两个信号量
算法实现:
begin
s1,s2:semaphore:=1,0;
cobegin
process A
begin
repeat
…
wait(s1);
拣黑子;
signal(s2);
until false
end
process B
begin
repeat
…
wait(s2);
拣白子;
signal(s1);
until false
end
coend
end
例题2:设在公共汽车上,司机何售票员的活动分别是:司机:启动车辆;正常行车;到站停车;售票员:上乘客,关车门;售票;开车门,下乘客;试用P,V操作对其过程进行控制。
问题分析:
1)进程关系分析:
有先后顺序,是同步
2)信号量分析:
两个信号量控制俩进程
run---司机进程信号量
启动车辆
正常行驶
到站停车
stop---售票员进程信号量
上乘客、关车门
售票
开车门、下乘客
var
stop,run:semaphore;
stop=1;run=0;
Begin
cobegin
conductor:
begin
repeat
上乘客,关车门;
signal(run);
售票;
wait(stop);
开车门,下乘客;
until false
end
driver:
begin
repeat
wait(run);
正常行驶;
到站停车;
signal(stop);
until false
end
coend
end
例题3:和尚挑水问题:寺庙里有多个小和尚和老和尚,有一个水缸一个水井三个水桶。小和尚从井中打水倒入水缸,只能容纳10桶水,老和尚从水缸中取水喝。水井每次只能入一个水桶,水缸入水、取水也每次只能一个水桶。试用P,V操作描述和尚挑水、饮水的互斥同步过程。
问题分析:
1)进程关系分析:
多个打水进程互斥,多个取水进程互斥,打水、取水进程同步
2)信号量分析:
①水井、水缸两个互斥信号量:
mutex1—水井;mutex2—水缸;初值均为1;
②打水进程信号量:
empty(水缸不满时可以打水)初值为10;
③取水进程信号量:
full(水缸有水时可以取水)初值为0;
④水桶个数:
count(初值为3)
varmutex1,mutex2,empty,full,
count:semaphore;
mutex1:=1;mutex2:=1;
empty:=10;full:=0;
count:=3;
begin
parbegin
yongmonk:
begin
repeat
…
p(empty);
p(count);
p(mutex1);
从水井打水;
v(mutex1);
p(mutex2);
往缸中放水;
v(mutex2);
v(full);
v(count);
until false
end
old monk:
begin
repeat
…
p(full);
p(count);
p(mutex2);
从水缸中取水;
v(mutex2);
v(count);
v(empty);
until false
end
parend
end