第一题 放水果 南京大学计算机考研真题
桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
这个题目涉及的东西非常之多,光人物就有三个再加水果,盘子等等,确实让人感觉好像无从下手。但不管题目如何变,只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。
下面先考虑同步情况即所有“等待”情况:
第一.爸爸要等待盘子为空。
第二.儿子要等待盘中水果是桔子。
第三.女儿要等待盘中水果是苹果。
接下来来考虑要互斥处理的资源,看起来盘子好像是要作互斥处理的,但由于题目中的爸爸、儿子、女儿均只有一个,并且他们访问盘子的条件都不一样,所以他们根本不会同时去访问盘子,因此盘子也就不用作互斥处理了。分析至些,这个题目已经没有难度了,下面用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(同时允许两辆车),可供两辆车在已进入两端小车错车,设计算法并使用P,V实现。
这个问题应该如何考虑了?同样只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。
本题中,应设置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
四
待续