一个P,V操作的习题

题目:在一个盒子里,混装了数量相等的黑白围棋子。现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1 和P2 ,其中P1 拣白子;P2 拣黑子。规定每个进程每次只拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣。试写出两进程P1 和P2 能并发正确执行的程序。

 

分析:

PV操作的题,也就是与信号量处理相关的问题,对于学生而言,一般是比较棘手的。不知道该如何入手。一般而言,主要是上课听课不认真,另外就是没有做过练习题造成的。

信号量,说白了,就是生活中的一个标志。比如火车上的卫生间,为了防止大家误入,卫生间门上有个标志,进去了的人将标志设为“有人”,出来以后再设置为“无人”,大家约定,看到“有人”就不能进入,否则就可以进入。如果大家都遵守这个约定,那么就不会多个人一同进去了。“有人”“没人”就可以在计算机中用0和1来表示。卫生间进人,需要将“没人”变成“有人”,实际上就是将1变成0。人从卫生间出来,需要将“有人”变成“没人”,就是将0变成1。  好了,将1变成0,我们用P来表示(减一),将0变成1我们用V来表示(加一),P V操作就有了。

解决PV的习题,就是要想办法设置好这个标志,然后对标志进行加减操作。

 

解答:

思路一:

捡棋子,这个问题的关键就在于,我捡完了你捡,你捡完了我捡,不能连续捡。如果让两个进程在盒子里捡,那么很明显,我们要设置两个标志F1,F2。F1=1表示P1可以捡,F2=1表示P2可捡,另外P1,P2要约定好,某个进程准备捡的时候要先将自己的标志置0,捡完了,要把对方的标志置1。这样就可以防止两次连续进入了。

 

因此设置信号量:F1=0,F2=1(哪个为0,哪个为1无所谓)。

P1

P(F1)

   捡白子

V(F2

 

P2

P(F2)

   捡黑子

V(F1

 

 

 思路二:

设置信号量s=1,代表盒子,盒子同一时刻只能有一个进程访问

设置信号量k=1,代表刚刚P1操作过。如果k=0,代表P2刚刚操作过。

P1

P(s)

If(k=1

{ 什么都不做}

else

   {捡白子,k=1}

V(s

 

P2

P(s)

If(k=0

{ 什么都不做}

else

   {捡白子,k=0}

V(s

 

 

思路二也是对的,程序也可以正确运行。但是相比思路一,思路二程序的效率肯定不高。

因此PV操作的答案是不唯一的。都可能对,且保证不出错,但是效率的高不高可不一定。

老羊快跑,欢迎关注。

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值