加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原创】PV操作 前驱图

(2013-08-03 19:15:31)
分类: 杂谈

题目(选自软件设计师考试 2009年下半年 试题25、26):

http://s14/mw690/6d79d83agx6BzjBMRZ34d&690前驱图" TITLE="【原创】PV操作 前驱图" />

 

http://s6/mw690/6d79d83agx6BzjGXQQB35&690前驱图" TITLE="【原创】PV操作 前驱图" />

正确答案:C B

看到这题后,我一开始感到很疑惑。发现题目中S1、S2、S3、S4这4个信号量并非是面向结点的(如果是面向结点的话,将正确答案代入无法推导到正确结果)。

 

首先,先来讲一下前驱图的概念:如原图,P1到P2有一条有向边,表示如果要执行P2,那么就要先执行P1,感觉类似于拓扑排序中的AOV网还有关键路径中的网,但是没有权值。再例如,对于点P3,要执行P1和P2后,才能执行P3。

浅谈思路:
题目告诉信号量的初值均为0,不妨把这些信号量看成一个互斥量。如果想要某个结点停止执行,那么就对它做P操作,这样信号量的值就小于0,被压入阻塞队列。如果完成了某个结点的计算,那么就把它连向的结点做V操作,这样就相当于“激活”了那些结点,继续执行程序,这样就完成了进程间的同步过程。

 

注意!其实我上面写的是PV操作题目的大致解法,并非是针对本题,我前面说过,4个信号量不是面向结点的(大家可以试着用这个方法去分析结点,得到的肯定不是正确答案)。

 

正确答案中有解析,它说:根据题意往图上标上信号量,给了一个图(我直接用画图软件往原体上标注,懒的拍照了):

http://s1/mw690/6d79d83agx6BzkY7GSI30&690前驱图" TITLE="【原创】PV操作 前驱图" />

其它的什么都没有说,没有告诉我这个图中的信号量是按照什么规则标注的,很火大!花了半个小时,才总算看出来是怎么解的。

其实是要根据选项来找出突破口。对于P1这个结点,它的入度是0(没有其它结点连向P1),那么通过这个结点进行的操作,必定是V操作(这样才能使被P1向连的结点从阻塞队列中唤醒),不可能出现P操作。所以选项AB可以排除。P2中的b很容易填,因为P1已经操作完毕,所以将P1直接扔到阻塞队列中,所以进行P操作 P(S1),这样第一个选项答案就明了了,即C。

 

现在我们只知道P1执行后,做的操作是V(S1),V(S2),那么从P1引出的两条有向边的信号量是S1,S2,但是并不知道它们具体的表示。

图:


http://s15/mw690/6d79d83agx6Bzm1Qlsi1e&690前驱图" TITLE="【原创】PV操作 前驱图" />


我们先记住这两个情况,把这两种情况都代入到第二个选项去看看,总有一个是不符合题意的。


发现在执行完P2后,做了一个V(S3)的操作,说明P2连出的边所指示的信号量为S3(这是肯定的)。

 

确定了3条边之后,那么第四条就能够确定了,即S4(P3-->P4)

 

先看情况2:

执行P3之前,做的操作(根据图)应该是P(S3) P(S1),可是很遗憾,所有选项中并没有关于这个的选项。

 

看情况1:

执行P3之前,做的操作应当是P(S2),P(S3),发现B选项和D选项都符合。因为S3是S4的前驱,执行P4之前,要将信号量S4减去1,即P(S4)。发现选项B完全符合,所以正确答案为B。

 

这篇博文纯属本人的备忘,希望能对初学者有一个参考。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有