p(rmutex); p(wmutex);
if rcount==0 then 写数据; p(wmutex); v(wmutex); v(rmutex); v(w) v(w); end 读数据; p(rmutex);
rcount:=rcount-1; if rcount==0 then v(rmutex); v(rmutex); end coend
3 吸烟者问题 这个题目很传统,和前面问题一致这里简单阐述一下。这里再给出一个简单解法。 k 三个吸烟者(A,B,C)和一个经销商(D),三个吸烟者可以吸烟的条件不一样,具 体看经销商往桌子上放的原料
k 每个吸烟者需要一个进程,分别和经销商进行同步 k 互斥资源:桌子
k A,B,C,D四个进程,A表示烟草拥有者,B是纸拥有者,C火柴拥有者,D经销 商
k S实现互斥,表示桌子上是否放有东西
k Sad,Sbd,Scd分别表示进程AD,BD,CD之间的同步
CHAPTER 3. 九阴真经之研究生题辑52
The P,V code Using Pascal
cobegin
经销商烟草拥有者纸拥有者火柴拥有者 begin begin begin begin p(s); p(Sad); p(Sbd); p(Scd);
放原料; 取纸和火柴; 取烟草和火柴; 取纸和烟草; if(纸和火柴) v(s); v(s); v(s);
v(Sad); 吸烟; 吸烟; 吸烟; else end end end if(烟草和火柴) v(Sbd); else v(Scd); end coend
4 生产者-消费者扩展 有n+1个进程A1,A2,¢ ¢ ¢ ,An和B: k (1)A1,A2,¢ ¢ ¢ ,An通过同一个缓冲池各自不断地向B发送消息,B不断地取消 息,它必须取走发来的每个消息,刚开始时缓冲区为空,使用P,v操作实现之。
k (2)若缓冲区个数增至M个,试用P,V实现正确通讯
这个问题较为简单,请读者自行解决。这里给出参考答案。
The P,V code Using Pascal
var full,empty,mutex:semaphore; full=0; empty=1; mutex=1; cobegin
procedure A_i(i=1,...,n) procedure B: begin begin
p(empty); P(full); p(mutex); p(mutex);
put message to the buffer; Get the message; v(mutex); v(mutex); v(full); v(empty); end end
5 阅览室问题
有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一个座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试问;
k (1)为描述读者的动作,应编写几个程序,设臵几个进程?
CHAPTER 3. 九阴真经之研究生题辑53
k (2)试用PV操作描述各个进程之间的同步互斥关系。 问题分析:
读者动作有两个,一个时填表进入阅览室,这时要考虑阅览室里是否有空位;一是读者阅读完毕,离开阅览室,这时的操作要考虑阅览室里是否有读者。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
算法的信号量有三个:seats-表示阅览室时否有座位(初值为100);readers-表示阅览室里的读者数,初值为0;用于互斥的mutex,初值为1。
The P,V code Using Pascal
var seats, raaders,mutex:semaphore; seats:=100; readers:=0; mutex:=1; cobegin
procedure Enter begin
while TRUE begin
p(seats); //没有座位则离开 p(mutex); //进入临界区 填写登记表;
进入阅览室阅读; v(mutex); //离开临界区 v(readers); end end
procedure Leave begin
while TRUE begin
p(readers); p(mutex); 消掉登记; 离开阅览室; v(mutex); v(seats); end end coend
_思考:
某超市可同时供100人购物,入口处备有篮子,每个购物者可带一个篮子入超市购物,出口时结账并归还篮子(出入口仅容一人)。
CHAPTER 3. 九阴真经之研究生题辑54
6 P,V改错(2001)
设有两个优先级相同的进程P1,P2如下。令信号S1,S2的初值为0,已知z=2,试问P1,P2并发运行结束后x=?y=?z=? 进程P1 进程P2 y:=1; x:=1;
y:=y+2; x:=x+1; V(S1); P(S1); z:=y+1; x:=x+y; P(S2); V(S2); y:=z+y; z:=x+z;
受信号量S1和S2的控制,进程P1和P2中P,V操作的顺序应明确。但当进程P2执行v(S2)调用后,可能会产生这种情形,即P2中的语句“z:=x+z”可以在P1中的语句“y:=z+y”前面或后面执行,因而P1和P2并发运行结束后,有两种可能的结果。即: x=5、y=12、z=9或x=5、y=7、z=9。 7 面包店(2001)
面包师有很多面包,由n个销售人员推销。每人顾客进店后先取一个号,并且等待叫号。当一个销售人员空闲下来时,就叫下一个号。试设计一个使销售人员和顾客同步的算法。 问题分析:
该题目和银行排队问题一致的。解法一样!! 8 公交车问题(2002)
在一辆公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关门,当售票员关好车门后,司机才能继续开车行驶。试用P、V操作实现司机与售票员之间的同步。 9 P,V改错(2002)
下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之: parbegin var x:integer;
process P1 process P2
var y, z:integer; var t, u:integer; begin begin x:=1; x:=0; y:=0; t:=0;
if x≥1 then y:=y+1; if x≤1 then t:=t+2; z:=y; u:=t; end end parend
CHAPTER 3. 九阴真经之研究生题辑55
他们不能正确运行。因为题中的进程P1和P2之间有一个共享变量X,由于进程的并发执行,可能会产生与时间有关的错误。比如进程P1先于P2运行,程序执行完成后Z的值是1,u的值为2.但若进程P1 执行到赋值语句“X:=1”后,进程调度P2运行,此时X的值又被重新赋值为0,待进程P2运行结束后,进程P1运行,当两个进程都结束运行时,Z的值0,u的值2.若要使P1和P2能正确执行,必须设臵一互斥信号量,以便对P1和P2中的临界区互斥使用。改正后的程序如下:
The P,V code Using Pascal
parbegin var x:integer;
mutex:semaphore; process P1 process P2
var y, z:integer; var t, u:integer; begin begin
p(mutex); p(mutex); x:=1; x:=0; y:=0; t:=0;
if x≥1 then y:=y+1; if x≤1 then t:=t+2; v(mutex); v(mutex); z:=y; u:=t; end end parend__