考研P、V操作习题答案

  • 格式:doc
  • 大小:75.00 KB
  • 文档页数:9

下载文档原格式

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

信号量应用问题:

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);

-N

其中,N和M时正整数。

试用“存放A”、“存放B”和P、V操作描述产品A与产品B的入库过