- 由三个进程get,copy和put以及两个缓冲区buffer1和buffer2完成一项输入/输出操作。进程get的功能是把一张卡片上的信息从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程put的功能是取出buffer2中的信息并从打印机上打印输出。试用P、V操作完成这三个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的作用和初值。
分析:可设置6个信号量mutex1,mutex2,empty1,empty2,full1,full2。
mutex1和mutex2是互斥信号量,初值为1,分别用于对buffer1和buffer2的互斥访问;
empty1和empty2为同步信号量,初值为1,分别表示buffer1和buffer2是否空闲,1表示空闲,0表示不空闲;
full1和full2为同步信号量,初值为0,分别表示buffer1和buffer2中是否有可取用的信息,1表示有可取用的信息,0表示无可取用的信息。semaphore mutex1, mutex2, empty1, empty2, full1, full2 ;
mutex1=mutex2=1;
empty1=empty2=1;
full1=full2=0;
parbegin
process get( )
{
while (1) {
从读卡机读入一张卡片的信息;
P(empty1);
P(mutex1);
将信息放入buffer1;
V(mutex1);
V(full1);
}
}
process copy( )
{
while (1) {
P(full1)
P(mutex1);
从buffer1中复制出信息;
V(mutex1);
V(emtpy1);
P(empty2);
P(mutex2);
将复制的信息放入buffer2;
V(mutex2);
V(full2);
}
}
process put( ){
while (1) {
P(full2);
P(mutex2);
从buffer2中取出信息;
V(mutex2);
V(empty2);
}
}
parend
- 若一只盘子一次只能放一个水果,A只往盘中放苹果,B只往盘中放梨子,C只从盘中取苹果,D只从盘中取梨子。试用:(1) 信号量和P、V操作;(2) 管程,写出同步算法。
采用P、V操作的同步算法如下:
semaphore SAB=1;
semaphore SC=0;
semaphore SD=0;
begin
parbegin
process A:
{
while(true) {
取一个苹果;
wait(SAB);
将一苹果放入盘中;
signal(SC)
}
}
process C:
{
while(true) {
wait(SC);
从盘中取出苹果;
signal(SAB);
消费该苹果;
}
}
process B:
{
while(true) {
取一个梨子;
wait(SAB);
将一梨子放入盘中;
signal(SD)
}
}
process D:
{
while(true) {
wait(SD);
从盘中取出梨子;
signal(SAB);
消费该梨子;
}
}
parend
end
采用管程的同步算法如下:
首先定义管程MPC,该管程可描述如下:
type MPC=monitor
var flag: integer;
empty: condition;
W: array[1..2] of condition
procedure entry put(integer k)
begin
if flag>0 then empty.wait;
flag=k;
放一k号水果入盘中;
if W[k].queue then full.signal;
end
procedure entry get(integer k)
begin
if flag<k then W[k].wait;
从盘中取k号水果;
flag := 0;
if empty.queue then empty.signal;
end
begin
flag :=0;
end
A、B、C、D四个进程的同步算法可描述如下:
parbegin
Process A
begin
任取一个苹果;
MPC.put(1);
end
Process B
begin
任取一个梨子;
MPC.put(2);
end
Process C
begin
MPC.get(1);
吃苹果;
end
Process D
begin
MPC.get(2);
吃梨子;
end
parend
- 设自行车生产车间有两个货架,货架A可以存放8个车架,货架B可以存放20个车轮;又设有4个工人,他们的活动是重复劳动,分别为:工人1 加工一个车架放入货架A中;工人2、3分别加工车轮放入货架B中(每人每次放入1个车轮);工人4从货架A中取一个车架,再从货架B中取两个车轮,组装成一辆自行车。试用PV操作实现四个工人的合作。
分析:信号量Aempty表示货架A的空位数,其初值为8;信号量Afull表示货架A上存放的车架数,其初值为0;信号量Bempty表示货架B的空位数,其初值为20;信号量Bfull表示货架B上存放的车轮数,其初值为0;信号量mutex用于互斥(初值为1)BEGIN
semaphore Aempty,Bempty,Afull,Bfull,mutex;
Aempty := 8;Bempty := 20;Afull := 0;Bfull := 0;mutex :=1;
PARBEGIN
Worker1:BEGIN
L1:生产1个车架;
P(Aempty);
P(mutex);
车架放到货架A;
V(Afull);
V(mutex);
goto L1;
END
Worker2、3:BEGIN
L2:生产1个车轮;
P(Bempty);
P(mutex);
车轮放到货架B;
V(Bfull);
V(mutex);
goto L2;
END
Worker4:BEGIN
L3:P(Afull);
P(Bfull);P(Bfull);
P(mutex);
取1个车架;取2个车轮;
V(Aempty);
V(Bempty);V(Bempty);
V(mutex);
组装成一辆自行车;
goto L3;
END
PAREND
END