操作系统第2章习题总汇.ppt

进程同步与互斥习题分析 解题步骤: 确定进程的个数及每个进程的工作; 确定关键工作步(需要控制的); 确定信号量表示的含义(开始或结束); 写出伪代码。 1.单行隧道问题 对一个单行的隧道进行模拟,为了避免碰撞,必须防止汽车同时从两端(A、B端)进入隧道。现要设计一个自动管理系统,管理规则如下:当隧道中有车辆在行驶时同方向的车可以驶入隧道,但另一方向的车必须在隧道外等待;当隧道中无车时,到达A 端(或B端)的车辆可以进入隧道,但不能从A、B端同时驶入隧道;当某方向在隧道中行驶的车辆使出了隧道且无车辆进入隧道时,应让另一方向等待的车辆进入隧道行驶。请用PV操作设计一个算法实现这个控制。 例:单行隧道问题。对一个单行的隧道进行模拟,为了避免死锁,必须防止汽车同时从两端进入隧道。如果一次只允许一辆车通过隧道,两个方向按车辆到达的先后顺序依次通过,请用pv操作设计一个算法实现这个控制。 1.单行隧道问题 P1() { 通过隧道; } P2() { 通过隧道; } 分析:本题涉及两个进程:P1和P2。隧道是一个临界资源,一次只能被一辆车占有,可以把它看作互斥问题。 设:一个互斥信号量sd=1,表示隧道是否可用。 int sd=1; cobegin P1() // P2() coend 1.单行隧道问题 P1() { P(sd); 通过隧道; V(sd); } P2() { P(sd); 通过隧道; V(sd); } 问题: 两个方向车辆通过隧道的交换比较平凡,系统效率不高。 分析:为了提高效率,把问题改为:一旦一辆车进入,则同一方向的车可以立即跟进。写出用信号量解决此问题的代码,不考虑“饥饿”的情况。(按照读者-写者问题处理) 设:3个信号量:c表示计数器,m表示对临界资源计数器的控制,sd表示对临界资源隧道的控制,即隧道是否可用。 int c=0,m=1,sd=1; cobegin P1() // P2() coend 1.单行隧道问题 P2() { P(sd); 通过隧道; V(sd); } P1() { P(m); /* m控制计数器c*/ if (c== 0 ) P(sd); /*p1第一辆车通过时占有隧道*/ c=c+1; V(m); 通过隧道; P(m); c=c-1; if(c==0) V(sd); /*p1最后一辆车通过后释放隧道 */ V(m); } 问题: 若P1过隧道,则后续车辆可以跟进; 若p2过隧道,一次只能过一辆; P1不会产生“饥饿”的现象,而p2会产生“饥饿”的现象。 分析:解决p2“饥饿”现象的方法:再设一个信号量k,让p1、p2排队,可以做到p1方向比p2方向晚来的车辆被k阻止。 int c=0,m=1,sd=1,k=1; cobegin P1() // P2() coend 1.单行隧道问题 P2() { P(k); P(sd); 通过隧道; V(sd); V(k); } P1() { P(k); /* 与P2一起排队 */ P(m); /* m1控制计数器c */ if (c== 0 ) P(sd); /*P1第一辆车通过时占有隧道*/ c=c+1; V(m); V(k); 通过隧道; P(m); c=c-1; if(c==0) V(sd); /*P1最后一辆车通过后释放隧道 */ V(m); } 问题: 若P1过隧道,则后续车辆可以跟进; 若p2过隧道,一次只能过一辆 。 分析:解决p2可以过多辆车的方法:按照读者-读者问题处理。即:p1为读者,p2为读者,但两个读者不能同时读 。 int c1=c2=0,m1=m2=1,sd=1; //c1、c2为计数器,m1、m2、sd为互斥信号量 cobegin P1() // P2() coend 1.单行隧道问题 P1() { P(m1); if (c1== 0 ) P(sd); c1=c1+1; V(m1); 通过隧道; P(m1); c1=c1-1; if(c1==0) V(sd); V(m1); } P2() { P(m2); if (

文档评论(0)

1亿VIP精品文档

相关文档