考研P、V操作习题答案
- 格式:doc
- 大小:75.00 KB
- 文档页数:9
信号量应用问题:
1.写出程序描述下列前趋关系。
S1->S2, S1->S3, S2->S4, S2->S5 , S3->S6, S4->S7, S5->S7, S6->S7
Var s1,s2, s3,s4:semaphore:=0, 0, 0, 0;
Begin
Parbegin
P1: begin
….;
V(s1);
V(s1);
End;
P2: begin
P(s1);
…;
V(s2);
V(s2);
End;
P3: begin
P(s1)
…
V(s3)
End;
P4: begin
P(s2);
…
V(s4);
P5: begin
P(s2);
..;
V(s4);
End;
P6: begin
P(s3)
..
V(s4)
End;
P7:begin
P(s4);
P(s4);
P(s4);
…
End;
Parend
end
2. 请用信号量实现4×100(4人,每人100米)接力赛的同步过程。
提示:前趋图同步问题,可设4个进程,三个信号量,进程1只设V操作,进程4只设P操作,其余进程先做P 操作再做V操作。
Var s1,s2,s3:semaphore:=0, 0, 0; Begin
Parbegin
Athlete1: begin
Run 100m;
V(s1);
End;
Athlete2: begin
P(s1)
Run 100m;
V(s2);
End;
Athlete3: begin
P(s2) ;
Run 100m;
V(s3);
End;
Athlete4: begin
P(s3);
Run 100m;
End;
Parend
end
3.设公共汽车上,司机和售票员的活动分别是:
司机:售票员:
启动车辆上乘客
正常行车关车门
到站停车售票
开车门
下乘客
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?请用信号量机制实现他们的同步。
/-假定初始状态为停车状态,引入信号量Stop和Run:
BEGIN
semaphore Stop,Run;
Stop:=Run:=0;
CoBegin
Driver: BEGIN
Repea t
Wa it(Run);
启动车辆;
正常行驶;
到站停车;
Si gnal(Stop);
Until False;
END;
Conductor:BEGIN
Repea t
上乘客;
关车门;
Si gnal(Run);
售票;
Wa it(Stop);
开车门;
下乘客;
Until False;
END;
CoEnd;
END;
生产者消费者问题:
1.桌上有一个可以容纳两个水果的盘子,每次只能放或取一个水果。
爸爸放苹果妈妈放橘子,两个儿子
吃苹果,两个女儿吃橘子。试用信
号量和P、V操作,编写实现爸爸、妈妈、儿子和女儿的并发工作程
序。
Mutex实现互斥放或取水果。
empty盘子可放水果数
Apple 盘子中放的苹果数
Orange 盘子中放的橘子数Semaphore mutex=1;
Semaphore empty=2;
Semahpore apple=0;
Semahpore orange=0;
Main()
{
Cobegin
Father();
Mother();
Son();
Daughter();
;
Coend)
}
Father()
{
While(true)
{ p(empty)
P(mutex)
放苹果
V(mutex)
V(apple)}
}
Mother()
{
While(true)
{ p(empty)
P(mutex)
放橘子
V(mutex)
V(orange)}
}
Son()
{
While(true)
{ p(apple)
P(mutex)
取苹果
V(mutex)
V(empty)}
}
Daughter()
{
While(true)
{ p(orange)
P(mutex)
取橘子
V(mutex)
V(empty)}
}
2、有一个仓库存放两种零件A和B,最大库容量各为m个。有一车间不断地取A和B进行装配,每次各取一个。为了避免零件锈蚀,遵循线入库者先出库的原则。有两组供应商分别不断地供应A和B(每次一个),为保证齐套和合理库存,当某种零件的数量比另一种数量超过n(n semaphore mutex=1, emptya=emptyb=m, fulla=fullb=0, sa=sb=n; main() { CoBegin Provider_A(); / /零件A供应商 Provider_B(); / /零件B供应商 Assembling_Shop(); //装配车间 CoEnd } Provider_A() { while(true) { p(emptya); p(sa); p(mutex); 将零件A放入仓库; v(mutex); v(fulla); v(sb); } } Provider_B() { while(true) { p(emptyb); p(sb); p(mutex); 将零件B放入仓库; v(mutex); v(fullb); v(sa); } } Assembling_Shop() { while(true) { p(fulla); p(fullb); p(mutex); 装配零件; v(mutex); v(emptya); v(emptyb); } } 3、有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,但要求: 每次只能存入一种产品(X或Y);