14. 设公共汽车上,司机的活动顺序是:启动车辆、正常行车、到站停车;售票员的活动顺序是:关车门、售票、开车门。现假设初始状态为:司机和售票员都已经在车上,汽车处于停止状态,车门处于开的状态。在汽车不断地到站、停车、行驶过程中,请用信号量的PV操作实现司机与售票员之间的同步关系。
参考答案:
第一步:确定进程
2个进程 Driver(司机)、Busman(售票员) Driver进程:
? 启动车辆 ? 正常行车 ? 到站停车 Busman进程:
? 关车门 ? 售票 ? 开车门
第二步:确定进程的同步、互斥关系
? 同步:当售票员将车门关上后,司机才可以启动车辆 ? 同步:当司机到站停车后,售票员打开车门
第三步:设置信号量
? 车门关上,close,初值0 ? 到站停车,stop,初值0
第四步:用伪代码描述
begin
close, stop:semaphore; close := 0; stop := 0;
cobegin
Driver ( ); Busman ( ); coend;
end;
process Driver ( )
begin L1: P(close);
启动车辆;
正常行始; 到站停车; V(stop); goto L1 end;
process Busman ( )
begin L2: 关车门; V(close); 售票;
P(stop); 开车门;
goto L2
end;
15. 哲学家进餐问题:五位哲学家吃面条,只有五根筷子,每个人必须用一双筷子才能吃面条。请用信号量的PV操作描述哲学家之间的关系。 参考答案:错误解法!!!!!!!
第一步:确定进程
5个进程 Pi(i= 0~4) Pi进程:
? 思考
? 拿起左边筷子 ? 拿起右边筷子 ? 吃面条
? 放下右边筷子 ? 放下左边筷子
第二步:确定进程的同步、互斥关系
互斥:筷子是互斥资源, 每个人都只能使用他左右的两根筷子
第三步:设置信号量
? chopstick[5] :表示5根筷子,初值 1
第四步:用伪代码描述
begin
chopstick[0~4] :semaphore; chopstick[0~4] := 1;
cobegin
process Pi(i=0,2,…,4) begin
思考;
P(chopstick[i] );
P(chopstick[i+1%5] ); 吃面条;
V(chopstick[i+1%5] ); V(chopstick[i] ); end coend;
end;
错误原因:假如所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,都在等待右侧筷
子,无限期地运行,但是都无法取得任何进展,即出现饥饿,所有哲学家都吃不上饭。 解决方案:
1、 至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他
所使用过的两支筷子,从而可使更多的哲学家进餐。
2、 规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家
则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐。而申请不到的哲学家进入阻塞等待队列,则先申请的哲学家会较先可以吃饭,因此不会出现饿死的哲学家。
3、 将拿筷子的操作做成原子操作,即当一个哲学家正在拿筷子的时候,其它的哲学家不能
动筷子,当他那好筷子开始吃饭的时候,其它哲学家才可以拿筷子。
这里给出正确解决方案中的第1种方案: 解:
第一步:确定进程
5个进程 Pi(i= 0~4) Pi进程:
? 思考
? 拿起左边筷子 ? 拿起右边筷子 ? 吃面条
? 放下右边筷子 ? 放下左边筷子
第二步:确定进程的同步、互斥关系
互斥:筷子是互斥资源, 每个人都只能使用他左右的两根筷子 同步:只能有四个人同时吃饭
第三步:设置信号量
? chopstick[5] :表示5根筷子,初值 1 ? num:表示允许吃面的人的个数,初值4
第四步:用伪代码描述
begin
chopstick[0~4] :semaphore; num : semaphore;
chopstick[0~4] := 1; num := 4;
cobegin
process Pi(i=0,2,…,4) begin
思考; P (num);
P(chopstick[i]);
P(chopstick[i+1%5] ); 吃面条;
V(chopstick[i+1%5] );
V(chopstick[i] ); V (num); end coend;
end;
16. 系统中只有一台打印机,有三个进程在运行中都需要使用打印机进行打印输出,问:这三个进程间有什么样的制约关系?试用信号量的PV操作描述这种关系。
参考答案:由于打印机是临界资源,三个进程共享临界资源,是互斥关系。 为临界资源设置互斥信号量s,初始值为1:
begin
s :semaphore; s := 1;
cobegin
process Pi(i=0,1,2) begin
其他工作; P (s); 打印; V (s); end coend;
end;
17. 根据例2.5,把题目修改为以下几种情况,请用PV操作实现他们之间的同步关系:
(1)桌上一个盘子,只能放一只水果。爸爸放苹果,妈妈放桔子,儿子只吃桔子,女儿只吃苹果。
(2)桌上一个盘子,只能放一只水果。爸爸放苹果,妈妈放桔子,儿子吃桔子、苹果。 参考答案:
第一步:确定进程
4个进程Father(爸爸)、Mother(妈妈)、Son(儿子)、Daughter(女儿) Father进程:
? 将苹果放入盘中 Mother进程:
? 将桔子放入盘中 Son进程:
? 从盘中取出桔子 ? 吃桔子 Daughter进程:
? 从盘中取出苹果 ? 吃苹果
第二步:确定进程的同步、互斥关系
? 同步:Father当盘中无水果时,才可以将苹果放入盘中 ? 同步:Mother当盘中无水果时,才可以将桔子放入盘中 ? 同步:Son当盘中有桔子时,才可以从盘中取出桔子
? 同步:Daughter当盘中有苹果时,才可以从盘中取出苹果
第三步:设置信号量
? 盘中无水果,Sp,初值1 ? 盘中有桔子,So,初值0 ? 盘中有苹果,Sa,初值0
第四步:用伪代码描述
begin
Sp,So,Sa:semaphore; Sp :=1; So :=0; Sa :=0;
cobegin
Father ( ); Mother ( ); Son ( );
Daughter ( ); coend; end;
process Father ( ) begin
L1: P(Sp);
将苹果放入盘中; V(Sa); goto L1; end;
process Mother ( ) begin
L2: P(Sp);
将桔子放入盘中; V(So); goto L2; end;
process Son ( ) begin
L3: P(So);
从盘中取出桔子; V(Sp) 吃桔子;