新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 计算机科学论坛计算机理论与工程『 计算机考研交流 』 → [原创]巴拿马运河问题的再次讨论 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2377 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]巴拿马运河问题的再次讨论 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     cpkug 帅哥哟,离线,有人找我吗?
      
      
      等级:大三暑假(ITELS考了7分!)
      文章:124
      积分:876
      门派:XML.ORG.CN
      注册:2007/7/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cpkug发送一个短消息 把cpkug加入好友 查看cpkug的个人资料 搜索cpkug在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看cpkug的博客楼主
    发贴心情 [原创]巴拿马运河问题的再次讨论

    以下引号部分摘自他人:


    巴拿马运河问题
    巴拿马运河建在太平洋和大西洋之间,由于太平洋和大西洋水面高度不同,有巨大落差,所以运河中建有T(T≥2)级船闸,并且只能允许单向通行,船闸依次编号为1,2,…,T,由大西洋来的船需要经过船闸T,T-1.,,,2,1通过运河到达太平洋,由太平洋来的船需要经由船闸1,2,…,T-1,T通过运河到达大西洋。使用P,V操作正确解决大西洋和太平洋的船只通航问题。

    分析思想:
    1) 巴拿马运河大西洋,太平洋两个方向的船设置为两个进程。Atlantic(),Pacific();
    2) 当一侧船来到运河,如果另一侧船在过河,则等待;如果自己方船在过河,同时己方船只的总过河船数小于T,则过河;如果己方船在过河,同时己方船只过河总数大于T,则等待。
    3) 为了避免饥饿和死锁,必须控制一次过河的船数T。

    信息量:
    A,P:=1  ——代表两边的船只是否允许通过的闸门。
    mutex1,mutex2:=1 ——互斥信息量

    程序:
    semaphore A=1;
    semaphore P=1;
    semaphore mutex1=1;
    semaphore mutex2=1;
    int PshipSum=0,AshipSum=0;
    int PshipCur=0,AshipCur=0;


    Pacific(){
    P(P);
    P(mutex1);
    PshipSum++; PshipCur++;
    if(PshipCur==1)
      P(A);
    if(PshipSum==T)
      P(P);
    V(P);
    V(mutex1)
    过河;
    P(mutex1);
     PshipCur--;
     if(PshipCur==0){
      V(A);  
      if(PshipSum==T) //先判断是否有P(P),如果有就进行V操作
       V(P);
            PshipSum=0; //每次船闸空了cur==0,都要清空计数器
     }
    V(mutex1);

    }

    Atlantic(){
    P(A);
    P(mutex2);
    AshipSum++; AshipCur++;
    if(AshipCur==1)
      P(P);
    if(AshipSum==T)
     P(A);
    V(A);
    V(mutex2);
    过河;
    P(mutex2);
     AshipCur--;
     if(AshipCur==0){
      V(P);  
      if(AshipSum==T)
       V(A);
            AshipSum=0;
     }
    V(mutex2);

    }

    针对上面所提供的的算法,提供本人的修改方案:

    1. 觉得只需要下面变量中的一行就够了,不需要两行;
    int PshipSum=0,AshipSum=0;
    int PshipCur=0,AshipCur=0;

    2. 觉得判断己方船只过河总数大于T时则后续船只应该等待的操作应该在判断是否允许通过闸门之后,不然会出现死锁;

    3. 觉得大西洋,太平洋初次对闸门的使用应该进行互斥,不然会出现死锁,拟增加互斥变量gate;


    以下是本人修改后的算法,有不足请指教:

    信息量:
    A,P:=1  ——代表两边的船只是否允许通过的闸门。
    gate :=1  ——代表对闸门的使用,大西洋,太平洋初次对闸门的使用应该进行互斥,不然会出现死锁,拟增加互斥变量gate;
    mutex1,mutex2:=1 ——互斥信息量

    程序:
    semaphore A=1;
    semaphore P=1;
    semaphore gate =1;
    semaphore mutex1=1;
    semaphore mutex2=1;
    int PshipCur=0,AshipCur=0;

    //在太平洋过闸门
    Pacific(){
    P(gate);
    if(PshipCur > 0)
     V(gate);
    P(P);
    P(mutex1);
    PshipCur++;
    if(PshipCur == 1) {
      P(A);
          V(gate);
        }
    V(mutex1)
    V(P);
    if(PshipCur == (T + 1))
     P(P);    
    过闸门;
    P(mutex1);
     PshipCur--;
     if(PshipCur==0)
      V(A);  
    V(mutex1);
    if(PshipCur == T){  
     V(P);
    }


    //在大西洋过闸门
    Atlantic(){
    P(gate);
    if(AshipCur > 0)
     V(gate);
    P(A);
    P(mutex2);
    AshipCur++;
    if(AshipCur==1) {
      P(P);
          V(gate);
        }
    V(mutex2);
    V(A);
    if(AshipCur == (T + 1))
     P(A);
    过闸门;
    P(mutex2);
     AshipCur--;
     if(AshipCur==0)
      V(P);  
    V(mutex2);
    if(AshipSum == T)
     V(A);
    }


    本人找不到官方的答案,希望知道者能贴出来,谢谢!


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/1 19:11:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/9/23 11:21:23

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms