PV操作摘抄题 待续

第一题 放水果 南京大学计算机考研真题

桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用PV原语实现爸爸、儿子、女儿三个并发进程的同步。

这个题目涉及的东西非常之多,光人物就有三个再加水果,盘子等等,确实让人感觉好像无从下手。但不管题目如何变,只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。

下面先考虑同步情况即所有“等待”情况:

第一.爸爸要等待盘子为空。

第二.儿子要等待盘中水果是桔子。

第三.女儿要等待盘中水果是苹果。

接下来来考虑要互斥处理的资源,看起来盘子好像是要作互斥处理的,但由于题目中的爸爸、儿子、女儿均只有一个,并且他们访问盘子的条件都不一样,所以他们根本不会同时去访问盘子,因此盘子也就不用作互斥处理了。分析至些,这个题目已经没有难度了,下面用PV原语给出答案:

先设置三个信号量,信号量Orange表示盘中有桔子,初值为0。信号量Apple表示盘中有苹果,初值为0。信号量EmptyDish表示盘子为空,初值为1。三个人的操作流程如下所示:

1.爸爸

P(EmptyDish)

if (rand()%2==0)

{   

    放桔子

    V(Orange)

}

else

{

    放苹果

    V(Apple)

}

 

2.儿子

P(Orange)

取桔子

V(EmptyDish)

 

3.女儿

P(Apple)

取苹果

V(EmptyDish)

 

 

第二题 安全岛 南开大学考研真题

在南开大学至天津大学间有一条弯曲的路,每次只允许一辆自行车通过,但中间有小的安全岛M(同时允许两辆车),可供两辆车在已进入两端小车错车,设计算法并使用PV实现。

这个问题应该如何考虑了?同样只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。

本题中,应设置5个信号量ST,TS,K,L,M,信号量ST表示是否允许自行车从南开大学去天津大学,其初值为1;信号量TS表示是否允许自行车从天津大学去南开大学,其初值为1;信号量K表示是否允许自行车通过路段S到K,其初值为1;信号量L表示是否允许自行车通过路段T到L,其初值为1;信号量M表示安全岛上还可停放自行车的数目,其初值为2。控制过程描述如下:

    Var ST,TS,K,L,M:integer:=1,1,1,1,2;

Begin

      Toji       *从南开大学到天津大学*

  Begin

   Repeat

   P(ST);

   P(K);        

   从S走到K;

   P(M);

   进入安全岛;

   V(K);

   P(L);

   从L走到T;

   V(M);

   V(L);

   V(ST);

   until false;

  end

      Toxing       *从天津大学到南开大学*

  Begin

   Repeat

   P(TS);

   P(L);

   从T走到L;

   P(M);

   进入安全岛;

   signal(L);

   P(K);

   从K走到S;

   V(M);

   V(K);

   V(TS);

   until false;

  end

  end

 

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7650470     

上面这一道题我修改了转载部分内容。




三 :

/*例3
设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车.
售票员:上乘客,关车门,售票,开车门,下乘客.用PV操作对其控制.

  分析:第一步:确定进程间的关系.司机到站停车后,售票员方可工作.同样,售票员关
  车门后,司机才能工作.所以司机与售票员之间是一种同步关系.第二步: 确定信号量及其
  值.由于司机与售票员之间要互通消息,司机进程设置一个私有信号量run,用于判断司机
  能否进行工作,初值为0.售票员进程设置一个私有信号量stop,用于判断是否停车,售票员
  是否能够开车门,初值为0.
*/
	stop = 0; run = 0;

  driver()//司机进程
  {
	  while (1)//不停地循环
		  {
						P(run);
		  			启动车辆;
		  			正常行车;
		  			到站停车;
		  			V(stop);
		  }
	 }

  busman()//售票员进程
  {
	  while(1)
		  {
						关车门;
			  		 V(run);
		  			 售票;
			  		P(stop);
		  			开车门;
			  		下乘客;
		  }
	}
  //注意:busman() driver() 两个不停循环的函数




摘抄自http://blog.csdn.net/yuanhuiqiao/article/details/5623309

四 

待续



  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值