2015年考研核心考点命题思路解密——操作系统 第2章 进程管理 PV算法 文件打印问题 过桥问题


1.        过桥问题

请用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。






【解析】按照PV算法“五步曲”,将独木桥的两端分别标记为A和B;可解本题如下:

第一步:找进程

l  方向A到B的行人

l  方向B到A的行人

第二步:找动作

(1).   方向A到B的行人的动作

l  过独木桥

(2).   方向B到A的行人的动作

l  过独木桥

第三步:找关系

l  不同方向上的行人要互斥过桥

第四步:找初值

l  用整形变量countA和countB分别表示A、B端上已在独木桥上的行人数,初值为0;

l  设置信号量SA用来实现对countA的互斥访问,初始值为1;

l  设置信号量SB用来实现对countB的互斥访问,初始值为1;

l  设置信号量mutex用来实现两个方向的行人对独木桥的互斥使用,初始值为1。

第五步:写PV算法,具体描述如下:

Var SA,SB,mutex:semaphore:=1,1,1;

CountA,countB:integer:=0,0:

begin

   parbegin

processA_B:

begin

wait(SA);                    //要过桥,等待修改countA的信号量

if(countA=0)then wait(mutex);   //若A到B无人等待过桥,需等待mutex信号

countA:=countA+1;            //等待过桥的人数量加1

signal(SA);                   //释放互斥信号量

过独木桥;

wait(SA);                    //过了桥,等待修改countA的互斥信号量

       countA:=countA-1;            //等待过桥的人数减1

        if(countA=0) then signal(mutex); //如果A到B已无人要过桥,释放mutex信号

signa(SA);                    //释放修改countA信号

       end

processB_A:

begin

wait(SB);                     //要过桥,等待修改countB的信号量

if(countB=0)then wait(mutex);   //若B到A无人等待过桥,需等待mutex信号

countB:=countB+1;            //等待过桥的人数量加1

signal(SB);                   //释放互斥信号量

过独木桥;                  //

wait(SB);                    //过了桥,等待修改countB的互斥信号量

       countB:=countB-1;            //该方向上过桥人数减1

        if(countB=0) then signal(mutex); //如果B到A已无人要过桥,释放mutex信号

signa(SB);                   //释放修改countB信号

       end

parend

end



版权声明:本文内容均来自于www.kaoyanliameng.com,为尊重原作者和版权,特此声明出处!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值