count = count +1; v(customer); p(barber); 理发; } else{ v(mutex); 离开; }
until false end coend end
_思考:
有3个理发师,3把理发椅子,n把供等候理发的顾客坐的椅子.由于有3位理发师,所以一次同时可以为三个顾客服务,设臵信号量max capacity, 用于表示空闲椅子的数量,初值为n.信号量barber chair表示空闲理发师(椅) 的数量,初值为3;信号量cust ready,finished,leaveb chair分别表示是否有顾客到来,理发完成,离开理发椅,它们的初值都为0;
The P,V code Using Pascal
begin
var max_capacity=n,barber_chair=3,cust_ready=0,finished=0, leave_b_chair = 0:semaphore; cobegin
process barber begin repeat
p(cust_ready); 理发; until false end
process customer begin repeat;
p(max_capacity);//是否有空闲椅子; 进入店里;
p(barber_chair);//是否有空闲的理发椅; 坐在理发椅上;
v(cust_ready);//唤醒理发师;
CHAPTER 3. 九阴真经之研究生题辑26
p(finished);//是否完成理发; 离开理发椅;
v(leave_b_chair); 离开店;
v(max_capacity); until false end coend end
六真经之读者写者问题扩展(南航2001)
问题描述:
一个主修动物行为学、辅修计算机科学的学生参加了一个课题,调查花果山的猴子是否能被教会理解死锁。他找到一处峡谷,横跨峡谷拉了一根绳索(假设为南北方向),这样猴子就可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子相越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用P/V 操作来解决该问题。 问题分析:
由于不允许两个方向的猴子同时跨越绳索,所以对绳索应该互斥使用,但同一个方向可以允许多只猴子通过,所以临界区可允许多个实例访问。本题的难点在于位于南北方向的猴子具有相同的行为,当一方有猴子在绳索上时,同方向的猴子可继续通过,但此时要防止零一方的猴子跨越绳索。类比经典的读者/写者问题,可以发现类似之处,但又不完全相同,因为没有类似的写者。进一步分析可将此题归结为两种读者间的同步与互斥问题。
The P,V code Using Pascal
Begin
var mutex,Smutex,Nmutex,SmonkeyCount,NmonkeyCount:semaphore; SmonkeyCount:=0;//从南向北攀越绳索的猴子数量 NmonkeyCount:=0;//从北向南攀越绳索的猴子数量 mutex:=1;//绳索互斥信号量
Smutex:=1;//南方向猴子间的互斥信号量 Nmutex:=1;//北方向猴子间的互斥信号量 cobegin
procedure South_i(i=1,2,3,...) begin
p(Smutex);
if SmonkeyCount==0 then p(mutex);
SmonkeyCount:=SmonkeyCount+1; v(Smutex);
Cross the cordage;
CHAPTER 3. 九阴真经之研究生题辑27
p(Smutex);
SmonkeyCount:=SmonkeyCount-1; if SmonkeyCount==0 then v(mutex); v(Nmutex); end
procedure North_j(j=1,2,3,...) begin
p(Nmutex);
if NmonkeyCount==0 then p(mutex);
NmonkeyCount:=NmonkeyCount+1; v(Nmutex);
Cross the cordage; p(Nmutex);
NmonkeyCount:=NmonkeyCount-1; if NmonkeyCount==0 then v(mutex); v(Nmutex); end coend
七真经之南航2002
进程P1和P2通过两个缓冲区给进程P11、P12、P21、P22传递信息,进程P11、P12取进程P1的信息,进程P21、P22取进程P2的信息。假定这两个缓冲区一样大小,所要传递的信息也与缓冲区一样大,同一时刻只能由一个进程往缓冲区中送信息或取信息。试用PV操作来实现这6个进程之间的同步与互斥关系。
The P,V code Using Pascal
var mutex,S11,S12,S21,S22,empty1, empty2,full1,full2:semaphore; empty1=empty2=1; full1=full2=0; sij=0;(i,j=1,2) mutex=1; cobegin
Procedure P1: procedure P2: begin begin
p(empty1); p(empty2); P(mutex); p(mutex);
put message into buff1; put message into buff2; v(mutex); v(mutex); v(S11); v(s21); v(S12); v(S22); v(fll1); v(full2);
CHAPTER 3. 九阴真经之研究生题辑28
end end
procedure Sij:(i=1,2,j=1,2) begin p(fulli); p(sij); p(mutex);
Get message from buffi; v(mutex); v(emptyi) end coend
八真经之管道通信问题(西北工大2000)
在管道通信机制中,用信号量描述读进程和写进程访问管道文件的过程,假设管道文件大小为10KB. 问题分析:
UNIX系统中,利用一个打开的共享文件来连接两个相互通信的进程,这个共享文件叫管道.作为管道输入的发送进程,以字符流的形式将信息送入管道,而作为管道输出的接收进程,从管道中获取信息.管道通信机制要提供三方面的协调能力:(1)互斥.当一个进程对管道进行读/写操作时,另一个进程必须等待.(2) 同步.当写进程把数据写
入管道后便去睡眠等待,直到输出进程取走数据后唤醒它.若一次写入的数据超过缓冲区剩余空间的大小,当缓冲区满时,写进程必须阻塞,并唤醒读进程。(3)对方是否存在.只有确定对方存在时,才能够进行通信.本题只需要考虑互斥,同步问题。由于只有一对进程访问管道,因此不需要设臵互斥信号量,只要设臵两个同步信号量empty,full.分别表示管道可写和可读.
The P,V code Using Pascal
begin
pipe:array[09] of kilobytes;
ts=10,length,in=0,out=0:integer; empty,full:semaphore=1,0; cobegin
process PipeWriter begin repeat
产生数据; p(empty);
length = data length; while(length>0 and ts>0) begin
pipe[in] = data of 1KB; in = (in+1) mod n;
ts = ts-1;
length = length - 1;
CHAPTER 3. 九阴真经之研究生题辑29
end v(full); end
process Consumer begin repeat; p(full);
从缓冲区取出一件物品; out = (out+1) mod n; ts = ts +1; v(empty); end coend end
九真经之吃水果问题(南京大学2000)
问题描述:
桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 问题分析:
在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
The P,V code Using Pascal
在本题中,应设臵三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;
信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。
同步描述如下: S=1; Sa=0; So=0; cobegin
Procedure father; /*父亲进程*/ Procedure son; /*儿子进程*/
Procedure daughter; /*女儿进程*/ coend