问题分析:
题中没有给出两个进程执行顺序之间的制约关系,只给出了一个数量上的制约关
系,即m·—buf1数据个数-buf2数据个数·n.不需要考虑缓冲区的大小,只需要考虑两个进程的同步和互斥.p2向buf2写数据比p1向buf1写数据的次数最少不超过m次,最多不能超过n次,反之也成立.所以是一个生产者和消费者问题。
将等式展开得:
(1)m·(buf1数据个数-buf2数据个数)·n;
(2)m·(buf2数据个数-buf1数据个数)·n;由于m,n都是正数,等式只有一个成立,不妨设
(1)成立.在进程p1和p2都没有运行时,两个缓冲区数据个数之差为0,因此,p1必须先运行,向buf1至少写m+1个数据后再唤醒p2运行.信号量s1表示p1一次写入的最大量,初值为n,s2表示p2一次写入的最大量,初值为-m.
TheP,VcodeUsingPascal
begin
varmutex1=1,mutex2=1,s1=n,s2=-m:
semaphore;
CHAPTER3.九阴真经之研究生题辑22
cobegin
processp1
begin
repeat
getdata;
p(s1);
p(mutex1);
写数据到buf1;
v(mutex1);
v(s2);
end
processp2
begin
repeat;
getdata;
p(s2);
p(mutex2);
写数据到buf2;
v(mutex2);
v(s1);
end
coend
end
_思考:
p1和p2每次执行时需要进行一些额外的操作.对于p2来说,它首先必须在自己的
缓冲区buf2中写入至少m个数据,此后p1和p2的同步可简单通过两个信号量来控制.题目的一个变形是要求:
-m·(buf2数据个数-buf1数据个数)·n;那么信号量的初值就变成m和n,若只有p1向buf1放入数据而p2不放入数据到buf2中,则p1最多可放m次.因此,设置信号量s1,初值为m,此外,每当p2放入一个数据到buf2中时,则使信号量s1增1,即p1增加一次放入数据到buf1的机会.反之,若只有p2向buf2放入数据而p1不放入数据到buf1中,则p2最多可放次.因此,设置信号量s2,初值为n,此外,每当p1放入一个数据到buf1中时,则使信号量s2增1,即p2增加一次放入数据到buf1的机会.
TheP,VcodeUsingPascal
begin
varmutex1=1,mutex2=1,s1=m,s2=n:
semaphore;
cobegin
processp1
begin
repeat
getdata;
p(s1);
p(mutex1);
写数据到buf1;
CHAPTER3.九阴真经之研究生题辑23
v(mutex1);
v(s2);//p1每放入一个数据到buf1同时使s2增加1
end
processp2
begin
repeat;
getdata;
p(s2);
p(mutex2);
写数据到buf2;
v(mutex2);
v(s1);//p2每放入一个数据到buf2同时使s1增加1
end
coend
end
三华南理工2000
一个从键盘输入到打印机输出的数据处理流程图如图所示。
其中键盘输入进程通过缓冲区buf1把数绝传送给计算进程,计算进程把处理结果通过buf2传送给打印进程。
假设上述两个缓冲区的大小分别为n1和n2,试写出键盘输入进程、计算进程及打印进程间的同步算法。
问题分析:
本题解决的试具有多个缓冲区的生产者和消费者之间的多阶段同步问题。
由于每个缓冲区中均有多个存储单元,因而要护持使用。
所以要为每个缓冲区设置一个互斥信号量。
TheP,VcodeUsingPascal
Begin
varempty1,empty2,full1,full2,mutex1,mutex2:
semaphore;
empty1:
=n1;
empty2:
=n2;
full1:
=0;
full2:
=0;
mutex1:
=mutex2:
=1;
cobegin
procedureInputprocedureCalculateprocedurePrint_Out
beginbeginbegin
Inputadata;p(full1);p(full2);
p(empty1);p(mutex1);p(mutex2);
p(mutex1);Getfrombuf1;GetDatafrombuf2;
CHAPTER3.九阴真经之研究生题辑24
Puttobuf1;v(mutex1);v(mutex2);
v(mutex1);v(empty1);v(empty2);
v(full1);Calculateit;Printoutthedata;
endp(empty2);end
p(mutex2);
putresulttobuf2;
v(mutex2);
v(full2);
end
coend
四真经之生产者消费者扩展(同济1996)
设有N个计算进程和M个打印进程共享同一个缓冲区,缓冲区长度为8。
各计算进程不断地把计算得到的结果送入缓冲区,各打印进程不断的从缓冲区取数并打印。
要求:
既不漏打,也不重复打印任一个结果。
并且,为了高效地工作,计算机进程在使用缓冲区的同时,允许打印进程从缓冲区中取数,反之亦然。
请用P、V操作作为同步机制,并用类PASCAL或类C,描述对应于计算进程和打印进程的程序。
五真经之理发师问题扩展(电子科技大学2000)
有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子,若没有顾客,则理发师睡觉,当一个顾客到来时,必须唤醒理发师进行理发,若理发师正在理发,又有顾客到来,则若有空椅子可坐就坐下来等,若没有空椅子就离开.
问题分析:
需要设置一个信号量barber,初值为0,用于控制理发师和顾客之间的同步关系.还需要设置一个信号量customer,初值为0,用于离开顾客与等候顾客之间的同步控制,为了记录等候的顾客数,应该设置一个计数器count,初值为0.当一个顾客到达时,需要在count上做加1操作,并根据count值的不同分别采取不同的动作,当顾客离开时,要对count上做减1操作,并根据count值的不同分别采取不同的动作;由于count是共享变量,因此要互斥使用,为此设置一个互斥信号量mutex;
TheP,VcodeUsingPascal
begin
varbarber=0,customer=0,count=0,mutex=1:
semaphore;
cobegin
processbarber
begin
repeat
p(customer);
p(mutex);
count=count-1;
v(barber);
v(mutex);
理发;
untilfalse
end
CHAPTER3.九阴真经之研究生题辑25
processcustomer
begin
repeat;
p(mutex);
if(countcount=count+1;
v(customer);
p(barber);
理发;
}
else{
v(mutex);
离开;
}
untilfalse
end
coend
end
_思考:
有3个理发师,3把理发椅子,n把供等候理发的顾客坐的椅子.由于有3位理发师,所以一次同时可以为三个顾客服务,设置信号量maxcapacity,用于表示空闲椅子的数量,初值为n.信号量barberchair表示空闲理发师(椅)的数量,初值为3;信号量custready,finished,leavebchair分别表示是否有顾客到来,理发完成,离开理发椅,它们的初值都为0;
TheP,VcodeUsingPascal
begin
varmax_capacity=n,barber_chair=3,cust_ready=0,finished=0,
leave_b_chair=0:
semaphore;
cobegin
processbarber
begin
repeat
p(cust_ready);
理发;
untilfalse
end
processcustomer
begin
repeat;
p(max_capacity);//是否有空闲椅子;
进入店里;
p(barber_chair);//是否有空闲的理发椅;
坐在理发椅上;
v(cust_ready);//唤醒理发师;
CHAPTER3.九阴真经之研究生题辑26
p(finished);//是否完成理发;
离开理发椅;
v(leave_b_chair);
离开店;
v(max_capacity);
untilfalse
end
coend
end
六真经之读者写者问题扩展(南航2001)
问题描述:
一个主修动物行为学、辅修计算机科学的学生参加了一个课题,调查花果山的猴子是否能被教会理解死锁。
他找到一处峡谷,横跨峡谷拉了一根绳索(假设为南北方向),这样猴子就可以攀着绳索越过峡谷。
只要它们朝着相同的方向,同一时刻可以有多只猴子通过。
但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。
如果一只猴子相越过峡谷,它必须看当前是否有别的猴子在逆向通过。
请使用P/V操作来解决该问题。
问题分析:
由于不允许两个方向的猴子同时跨越绳索,所以对绳索应该互斥使用,但同一个方向可以允许多只猴子通过,所以临界区可允许多个实例访问。
本题的难点在于位于南北方向的猴子具有相同的行为,当一方有猴子在绳索上时,同方向的猴子可继续通过,但此时要防止零一方的猴子跨越绳索。
类比经典的读者/写者问题,可以发现类似之处,但又不完全相同,因为没有类似的写者。
进一步分析可将此题归结为两种读者间的同步与互斥问题。
TheP,VcodeUsingPascal
Begin
varmutex,Smutex,Nmutex,SmonkeyCount,NmonkeyCount:
semaphore;
SmonkeyCount:
=0;//从南向北攀越绳索的猴子数量
NmonkeyCount:
=0;//从北向南攀越绳索的猴子数量
mutex:
=1;//绳索互斥信号量
Smutex:
=1;//南方向猴子间的互斥信号量
Nmutex:
=1;//北方向猴子间的互斥信号量
cobegin
procedureSouth_i(i=1,2,3,...)
begin
p(Smutex);
ifSmonkeyCount==0then
p(mutex);
SmonkeyCount:
=SmonkeyCount+1;
v(Smutex);
Crossthecordage;
CHAPTER3.九阴真经之研究生题辑27
p(Smutex);
SmonkeyCount:
=SmonkeyCount-1;
ifSmonkeyCount==0then
v(mutex);
v(Nmutex);
end
procedureNorth_j(j=1,2,3,...)
begin
p(Nmutex);
ifNmonkeyCount==0then
p(mutex);
NmonkeyCount:
=NmonkeyCount+1;
v(Nmutex);
Crossthecordage;
p(Nmutex);
NmonkeyCount:
=NmonkeyCount-1;
ifNmonkeyCount==0then
v(mutex);
v(Nmutex);
end
coend
七真经之南航2002
进程P1和P2通过两个缓冲区给进程P11、P12、P21、P22传递信息,进程P11、P12取进程P1的信息,进程P21、P22取进程P2的信息。
假定这两个缓冲区一样大小,所要传递的信息也与缓冲区一样大,同一时刻只能由一个进程往缓冲区中送信息或取信息。
试用PV操作来实现这6个进程之间的同步与互斥关系。
TheP,VcodeUsingPascal
varmutex,S11,S12,S21,S22,empty1,
empty2,full1,full2:
semaphore;
empty1=empty2=1;
full1=full2=0;
sij=0;(i,j=1,2)
mutex=1;
cobegin
ProcedureP1:
procedureP2:
beginbegin
p(empty1);p(empty2);
P(mutex);p(mutex);
putmessageintobuff1;putmessageintobuff2;
v(mutex);v(mutex);
v(S11);v(s21);
v(S12);v(S22);
v(fll1);v(full2);
CHAPTER3.九阴真经之研究生题辑28
endend
procedureSij:
(i=1,2,j=1,2)
begin
p(fulli);
p(sij);
p(mutex);
Getmessagefrombuffi;
v(mutex);
v(emptyi)
end
coend
八真经之管道通信问题(西北工大2000)
在管道通信机制中,用信号量描述读进程和写进程访问管道文件的过程,假设管道文件大小为10KB.
问题分析:
UNIX系统中,利用一个打开的共享文件来连接两个相互通信的进程,这个共享文件叫管道.作为管道输入的发送进程,以字符流的形式将信息送入管道,而作为管道输出的接收进程,从管道中获取信息.管道通信机制要提供三方面的协调能力:
(1)互斥.当一个进程对管道进行读/写操作时,另一个进程必须等待.
(2)同步.当写进程把数据写
入管道后便去睡眠等待,直到输出进程取走数据后唤醒它.若一次写入的数据超过缓冲区剩余空间的大小,当缓冲区满时,写进程必须阻塞,并唤醒读进程。
(3)对方是否存在.只有确定对方存在时,才能够进行通信.本题只需要考虑互斥,同步问题。
由于只有一对进程访问管道,因此不需要设置互斥信号量,只要设置两个同步信号量empty,full.分别表示管道可写和可读.
TheP,VcodeUsingPascal
begin
pipe:
array[09]ofkilobytes;
ts=10,length,in=0,out=0:
integer;
empty,full:
semaphore=1,0;
cobegin
processPipeWriter
begin
repeat
产生数据;
p(empty);
length=datalength;
while(length>0andts>0)
begin
pipe[in]=dataof1KB;
in=(in+1)modn;
ts=ts-1;
length=length-1;
CHAPTER3.九阴真经之研究生题辑29
end
v(full);
end
processConsumer
begin
repeat;
p(full);
从缓冲区取出一件物品;
out=(out+1)modn;
ts=ts+1;
v(empty);
end
coend
end
九真经之吃水果问题(南京大学2000)
问题描述:
桌上有一空盘,允许存放一只水果。
爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
问题分析:
在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。
当盘子为空时,爸爸可将一个水果放入果盘中。
若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。
本题实际上是生产者-消费者问题的一种变形。
这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
TheP,VcodeUsingPascal
在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;
信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。
同步描述如下:
S=1;
Sa=0;
So=0;
cobegin
Procedurefather;/*父亲进程*/
Procedureson;/*儿子进程*/
Proceduredaughter;/*女儿进程*/
coend
Procedurefather:
begin
while(TRUE)
begin
CHAPTER3.九阴真经之研究生题辑30
P(S);
将水果放入盘中;
if(放入的是桔子)
V(So);
else
V(Sa);
end
end
Procedureson:
begin
while(TRUE)
begin
P(So);
从盘中取出桔子;
V(S);
吃桔子;
end
end
Proceduredaughter:
begin
while(TRUE)
begin
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
end
end
十真经之安全岛问题(南开1997)
在南开大学至天津大学间有一条弯曲的路,每次只允许一辆自行车通过,但中间有小的安全岛M(同时允许两辆车),可供两辆车在已进入两端小车错车,设计算法并使用P,V实现。
问题分析:
由于安全岛M仅仅允许两辆车停留,本应该作为临界资源而要设置信号量,但根据题意,任意时刻进入安全岛的车不会超过两辆(两个方向最多各有一辆),因此,不需要为M设置信号量,在路口s和路口t都需要设置信号量,以控制来自两个方向的车对路口资CHAPTER3.九阴真经之研究生题辑31
源的争夺.这两个信号量的初值都是1.此外,由于从s到t的一段路只允许一辆车通过,所以还需要设置另外的信号量用于控制,由于M的存在,可以为两端的小路分别设置一个互斥信号量.
TheP,VcodeUsingPascal
varT2N,N2T,L,M,K:
semaphore;
T2N:
=1;
N2T:
=1;
L:
=1;
K:
=1;
M:
=2;
cobegin
ProcedureBikeT2N
begin
p(T2N);
p(L);
goTtoL;
p(M);
gointoM;
V(L);
P(k);
goKtos;
V(M);
V(k);
V(T2N);
end
ProcedureBikeN2T
begin
P(N2T);
p(k);
govtok;
p(M);
gointoM;
V(k);
P(L);
goLtoT;
V(M);
V(L);
V(N2T);
end
coend
CHAPTER3.九阴真经之研究生题辑32
十一真经之珍珑棋局问题
问题描述:
在一个盒子里,混装了数量相等的黑白围棋子·现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1和P2,其中P1拣白子;P2拣黑子。
规定每个进程每次拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣.试写出两进程P1和P2能并发正确执行的程序。
问题分析:
大家熟悉了生产-消费问题(PC),这个问题很简单。
题目较为新颖,但是本质非常简单即:
生产-消费问题的简化或者说是两个进程的简单同步问题。
答案如下:
TheP,VcodeUsingPascal
设信号量s1和s2分别表示可拣白子和黑子;
不失一般性,若令先拣白子。
varS1,S2:
semaphore;
S1:
=l;S2:
=0;
cobegin
processP1processP2
beginbegin
repeatrepeat
P(S1);p(S2);
pickThewhite;picktheblack;
V(S2);v(s1);
untilfalse;untilfalse;
endend
coend
十二真经之公交车问题(哈尔滨工业大学2000)
问题描述:
设公共汽车上,司机和售票员的活动分别如下:
司机的活动:
启动车辆:
正常行车;到站停车。
售票员的活动:
关车门;售票;开车门。
在汽车不断地到站、停车、行