经典的PV操作程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

11、有3个并发进程R、M、P,它们共享同一缓冲区。进程R负责从输入设备读信息,每读入一个记录后,就把它放入缓冲区中;进程M在缓冲区中加工读入的记录;进程P把加工后的记录打印输出。读入的记录经加工输出后,缓冲区又可以存放下一个记录。试写出它们能够正确执行的并发程序。
答:
Begin
a:=0;b:=0;c:=1;
cobegin
R:
begin
Repeat
P(c);
从输入设备读一记录到缓冲区;
V(a);
Until false
End;
M:
begin
Repeat
P(a);
在缓冲区中加工读入的记录;
V(b);
Until false
End;
P:
Begin
Repeat
P(b);
打印加工后的记录;
V(c);
Until false
End
Coend
End;
注:为了保证R首先执行,所以信号量c的初值应设为“1”。此外,由制约关系图可以看出,R、M和P不会竞争缓冲区资源,故无需设置用于互斥的公用信号量。
12、设有进程A、B、C,分别调用过程get、copy和put对缓冲区S和T进行操作。其中get负责把数据块输入缓冲区S,copy负责从缓冲区S中提取数据块复制到缓冲区T中,put负责从缓冲区T中取信息打印,如图所示。试描述get、copy及put的操作过程。

Begin
Empty1:=1;empty2:=1;
Full1:=0;full2:=0;
Cobegin
A:begin
Repeat
P(empty1);
将数据块输入缓冲区S;
V(full1);
Until false
End;
B:begin
Repeat
P(full1);
从缓冲区S中提取数据;
V(empty1);
P(empty2);
将数据复制到缓冲区T;
V(full2)
Until false
End;
C:begin
Repeat
P(full2);
从缓冲区T中取信息打印;
V(empty2)
Until false
End
coend
End;
注:进程B对进程A来说是消费者,而对进程C来说是生产者,进程B兼有消费者和生产者的功能。此外,为了在初启时能保证三进程按制约关系顺利执行,信号量empty1和empty2的初值均为“1”。

13、用P、V操作实现下述问题的解。
桌上有一个盘子,可以存放一个水果。父亲总是放苹果到盘子中,而母亲总是放香蕉到盘子中;一个儿子专等吃盘中的香蕉,而一个女儿专等吃盘中的苹果。
答:盘子是临界资源,应设置一互斥信号量mutex来实现放水果的互斥,其初值为1。此外,父亲和女儿、母亲和儿子之间存在同步关系,即分别设置信号量apple和banana来分别实现这种同步关系,其初值均为0。4个进程的并发程序如下:
Begin
Mutex:=1;
Apple:=0;banana:=0;
Cobegin
Father:begin
Repeat
P(mutext);
向盘中放苹果;
V(apple)
Until false
End;
Mother:begin
Repeat
P(mutext);
向盘中放香蕉;
V(banana)
Until false
End;
Daughter:begin
Repeat
P(apple)
取盘中苹果;
V(mutex)
Until false
End;
Son:begin
Repeat
P(banana);
取盘中香蕉;
V(mutex)

Until false
End
Coend
End;

14、在一个盒子里,混装了数量相等的围棋黑子和白子。现在要用自动分拣系统把白子和黑子分开。设系统有两个进程P1和P2,其中P1拣白子、P2拣黑子。规定每个进程每次只拣一子。当一进程正在拣子时,不允许另一进程去拣;当一进程拣了一子时,必须让另一进程去拣。试写出这两个并发进程能正确执行的程序。
答:可以设置两个信号量S1和S2来协调进程P1和P2之间的同步,此外,由于不存在进程P1和进程P2之间同时取子的竞争问题,因此不必设置互斥信号量。程序如下:
Begin
S1:=1;s2:=0;
Cobegin
P1:begin
Repeat
P(S1);
拣白子;
V(s2)
Until false
End;
P2:begin
Repeat
P(S2);
拣黑子;
V(S1)
Until false
End
Coend
End;

15、有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当一个顾客到来时,必须唤醒理发师进行理发;如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件。
答:本题可看作是n个生产者和一个消费者问题。顾客作为生产者,每到来一个就使计数器rc加1,以便让理发师理发(消费)至最后一个顾客(产品)。并且,第一个到来的顾客应负责唤醒理发师;如果不是第一个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发厅(该信息可由计数器rc获得)。理发师与顾客的并发程序描述如下:
Begin
Mutex:=1;
Wakeup:=0;wait:=0;
Cobegin
Customer i(i=1,…):
Begin
P(mutext);
Rc:=rc+1;
If rc=1 then V(wakeup)
Else
If rc<=n then P(wait) /*顾客人数<=n时在椅子上等待*/
Else begin
Rc:=rc-1; /*是第n+1个顾客时则离开*/
该顾客离开理发厅
End;
V(mutex)
End;
Barber:
begin
P(wakeup); /*没有顾客时理发师睡觉(阻塞),直到第一个顾客来时唤醒*/
Repeat
理发;
P(mutex);
Rc:=rc-1;
If rc<>0 then V(wait) /*让等待中的一个顾客准备理发*/
V(mutex)
Until rc=0
End
Coend
End;

16、桌子上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子;儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿3个并发进程的同步。
答:
Begin
Plate:=1;apple:=0;orange:=0;
Cobegin
Father:begin
Repeat
P(plate);
将水果放入盘中;
If 放入的是桔子 then V(orange)
Else V(apple)
Until false
End;
Son: begin
Repeat
P(orange)
从盘中取出桔子;
V(plat

e);
吃桔子
Until false
End;
Daughter:begin
Repeat
P(apple);
从盘中取出苹果;
V(plate);
吃苹果
Until false
End
Coend
End;


相关文档
最新文档