主观题:h412.图2-5是一条运河和一条公路,运河上有2座间隔80米的吊桥A和B,一条弯曲的公路为绕过一片沼泽地从这两座桥上通过。已知运河上的运输......
图2-5是一条运河和一条公路,运河上有2座间隔80米的吊桥A和B,一条弯曲的公路为绕过一片沼泽地从这两座桥上通过。已知运河上的运输由100米长的驳船担负,公路运输由普通的汽车担负。运河和公路都是单向行驶的(如图2-5中箭头所示)。一条驳船距离吊桥A约20米时先拉响汽笛警告,若桥上无车辆则吊桥被吊起,直到驳船通过A后吊桥才被放下,对吊桥B也按此方法处理。对于汽车,只要前方的吊桥落下就可以通行。试用P、V操作实现车船运输机制且不产生死锁。
答案:【分析】
因为吊桥A和B之间的长度小于驳船的长度,因此当驳船过桥时,应请求两个吊桥抬起来,否则可能产生死锁。
当前面的驳船请求并占有吊桥后,后续的驳船将不必再请求吊桥,鱼贯式地过桥即可。当这批船队的最后一条驳船离开吊桥B后,再释放两个吊桥A和B。汽车过桥的原理与驳船类似。
因此,本题实际上是“单行铁路问题”、“过独木桥问题”、“A、B两组读进程共享一个文件”等问题的变形。
解:
semaphore Ship_mutex, Car_mutex, S_C_mutex;
Ship_mutex=1; //互斥信号量,用于Ship互斥访问共享变量Ship_count
Car_mutex=1; //互斥信号量,用于Car互斥访问共享变量Car_count
S_C_mutex=1; //互斥信号量,用于Ship与Car互斥过桥A、B
Pargegin
process ship( )
{
P(Ship_mutex);
if (Ship_count==0) P(S_C_mutex);
Ship_count++;
V(Ship_mutex);
Ship_go_on( ); //船通过AB段
P(Ship_mutex);
Ship_count--;
if (Ship_count==0) V(S_C+mutex);
V(Ship_mutex);(5分)
}
process car( )
{
P(Car_mutex);
if (Car_count==0) P(S_C_mutex);
Car_count++;
V(Car_mutex);
Car_go_on( ); //汽车通过BA段
P(Car_mutex);
Car_count--;
if (Car_count==0) V(S_C+mutex);
V(Car_mutex);(5分)
}
parend
答案:【分析】
因为吊桥A和B之间的长度小于驳船的长度,因此当驳船过桥时,应请求两个吊桥抬起来,否则可能产生死锁。
当前面的驳船请求并占有吊桥后,后续的驳船将不必再请求吊桥,鱼贯式地过桥即可。当这批船队的最后一条驳船离开吊桥B后,再释放两个吊桥A和B。汽车过桥的原理与驳船类似。
因此,本题实际上是“单行铁路问题”、“过独木桥问题”、“A、B两组读进程共享一个文件”等问题的变形。
解:
semaphore Ship_mutex, Car_mutex, S_C_mutex;
Ship_mutex=1; //互斥信号量,用于Ship互斥访问共享变量Ship_count
Car_mutex=1; //互斥信号量,用于Car互斥访问共享变量Car_count
S_C_mutex=1; //互斥信号量,用于Ship与Car互斥过桥A、B
Pargegin
process ship( )
{
P(Ship_mutex);
if (Ship_count==0) P(S_C_mutex);
Ship_count++;
V(Ship_mutex);
Ship_go_on( ); //船通过AB段
P(Ship_mutex);
Ship_count--;
if (Ship_count==0) V(S_C+mutex);
V(Ship_mutex);(5分)
}
process car( )
{
P(Car_mutex);
if (Car_count==0) P(S_C_mutex);
Car_count++;
V(Car_mutex);
Car_go_on( ); //汽车通过BA段
P(Car_mutex);
Car_count--;
if (Car_count==0) V(S_C+mutex);
V(Car_mutex);(5分)
}
parend