1、设公共汽车上,司机和售票员的活动分别是:
司机的活动:
启动车辆;
正常行车;
到站停车;
售票员的活动:
关车门;
售票;
开车门;
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用P、V操作实现它们的同步。
解:设两个信号量S和C,初值为S=0;C=0;
司机: L1:正常行车 售票员: L2: 售票
到站停车 P(S)
V(S) 开车门
P(C) 关车门
启动开车 V(C)
GO TO L1 GO TO L2
2、桌子上有一个空盘子,允许存放一只水果,爸爸可以向盘中放苹果,妈妈向盘子中放橘子,女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。规定当盘子空的时候一次只能放一只水果,请用信号量实现他们之间的同步与互斥。
S, S1, S2 :semaphore=1,0,0;
Cobegin:
Process Father:
Begin:
L1: P(S);
Put Apple;
V(S1);
GO TO L1;
End;
Process Mother:
Begin:
L2: P(S);
Put Orange;
V(S2);
GO TO L2;
End;
Process Son:
Begin:
L3: P(S2);
Get Orange;
V(S);
GO TO L1;
End;
Process Daughter:
Begin:
L4: P(S1);
Get Apple;
V(S);
GO TO L4;
End;
CoEnd;
4、有一个仓库,可以存放A、B两种产品,但要求:
① 每次只能存入一种产品(A或B);
② A产品数量-B产品数量<M;
③ B产品数量-A产品数量<N;
其中M、N是正整数,使用P、V操作描述产品A与产品B的入库过程。
Mutex,Sa,Sb: Semaphore;
Mutex =1;
Sa=M-1;
Sb=N-1;
CoBegin:
Process PA:
Begin
Loop:
P(Sa);
P(Mutex);
产品A入库;
V(Mutex);
V(Sb);
Goto Loop;
End;
Process PB:
Begin
Loop:
P(Sb);
P(Mutex);
产品B入库;
V(Mutex);
V(Sa);
Goto Loop;
End;
CoEnd;
6、理发师问题:一个理发店有N张沙发和一张理发椅,没有顾客要理发时,理发师便去睡觉;当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。使用信号量实现这一同步问题。
解答:为解决上述问题,需要设置一个整形变量count用来对理发店中的顾客进行计数,再设置7个信号量:mutex用来实现顾客进程对count变量的互斥访问,其初值为1;sofa是对应于等候室中N张沙发的资源信号量,其初值为N;empty表示是否有空闲的理发椅,其初值为1;full表示理发椅上是否坐有等待理发的顾客,其初值为0;cut用来等待理发的完成,其初值为0;payment用来等待付费,其初值为0;receipt用来等待收费,其初值为0。
Int count =0;
Mutex,sofa,empty,full,cut,payment,receipt: semaphore =1,N,1,0,0,0,0;
CoBegin:
Process Guest:
Begin:
P (mutex);
If(count>N) then
{ v(mutex);
exit shop;
}
else
{ count ++;
if ( count >1)then
{ p(sofa);
sit on sofa;
p(empty);
get up from sofa;
v(sofa);
}
else //count=1
{ p(empty);
sit on the baber_chair;
v(full);
p (cut);
pay;
v(payment);
p(receipt);
get up from the baber_chair;
v(empty);
p(mutex)
count--;
v(mutex);
exit shop;
End;
Process Barber:
Begin
Loop:
P(full);
Cut hair;
V(cut);
P(payment);
Accept payment;
V(receipt);
Goto Loop;
CoEnd;
15、有一个阅览室,共有100个座位。读者进入阅览室时必须在入口处进行登记;离开阅览室时必须进行注销。试用PV操作描述读者进入/离开阅览室的同步与互斥关系。
参考答案:
第一步:确定进程
可以进入阅览室的读者可以有很多,这里设为n,即 n个Reader(读者)进程
Reader进程:
l 登记
l 进入阅览室
l 读书
l 离开阅览室
l 注销
第二步:确定进程的同步、互斥关系
l 同步:当教室内有空座位时,读者才可以登记,并进入阅览室
l 互斥:同时只能有一个读者在入口处进行登记
l 互斥:同时只能有一个读者在出口处进行注销
第三步:设置信号量
l 教室内空座位数量,seat,初值100
l 为入口处进行登记设置互斥信号量Sin,初值 1,表示当前可用
l 为出口处进行注销设置互斥信号量Sout,初值 1,表示当前可用
第四步:用伪代码描述
begin
Sin, Sout, seat:semaphore;
seat :=100;
Sin := 1;
Sout := 1;
cobegin
process Reader-i ( i = 1,2,…,n );
begin
P(seat);
P(Sin);
登记;
V(Sin);
进入阅览室;
读书;
离开阅览室;
P(Sout);
注销;
V(Sout);
V(seat);
end
coend;
end;
18. 有三个进程PA、PB、PC合作解决文件打印问题:PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的记录复制到缓冲区2,每执行一次复制一个记录;PC打印缓冲区2中的记录,每执行一次打印一个记录。每个缓冲区只能存放一个记录。请用信号量机制实现文件的正确打印。
解:本题中,进程PA、PB、PC之间的合作关系如图所示:
当缓冲区1为空时,PA可将记录读入其中,否则,PA需等待;
当缓冲区1有记录而缓冲区2为空时,PB可进行复制工作,否则PB需等待;
当缓冲区2有记录时,PC可打印记录,否则PC需等待。
为此,设置4个信号量empty1、empty2、full1、full2,其中empty1、empty2分别表示缓冲区1和缓冲区2是否为空,初值均为“1”;full1、full2分别表示缓冲区1和缓冲区2中是否有记录,其初值均为“0”。算法描述如下: