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

    >> 操作系统研究。UEFI
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 操作系统原理 』 → [求助]PV操作控制两组进程的疑问 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 12388 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [求助]PV操作控制两组进程的疑问 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Maxwin_ 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:85
      门派:XML.ORG.CN
      注册:2006/12/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Maxwin_发送一个短消息 把Maxwin_加入好友 查看Maxwin_的个人资料 搜索Maxwin_在『 操作系统原理 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Maxwin_的博客楼主
    发贴心情 [求助]PV操作控制两组进程的疑问

    有一个文件F供进程共享,现把这些进程分成A B两组,规定同一组的进程可以同时进行读; 但当有A组(或B组)在读时就不允许另一组进行读。
    //貌似有个过桥问题也是如此
    不知道分析的是否正确,同时求解决方法。
    //以下是书上的答案:
    readA {
        P(SAB);
        CA ++;
        if (CA == 1) P(SB);    //无意义
        V(SAB);

        read F;

        P(SAB);
        CA --;
        if (CA == 0) V(SB);
        V(SAB);
    }

    readB {
        P(SAB);
        CB ++;
        if (CB == 1) P(SA);
        V(SAB);

        read F;

        P(SAB);
        CB --;
        if (CB == 0) V(SA);
        V(SAB);
    }

    但是当A B两组进程同时进行时,SA和SB并没有什么作用。可能出现以下情况造成A B进程在同时读
    A1先要求读,B1紧接着也要读:

    A1: P(SAB);    //申请成功,继续
    B1: P(SAB);    //进入SAB等待队列
    A1: CA++; ...
        V(SAB);    //释放SAB,唤醒B1进程
    B1: CB++; ...
        V(SAB);
    //以下造成两组都在读。
    A1: read F;
    B1: read F;
    =================================
    我做改进如下:
    readA {
        P(SA);
        P(SAB);
        CA ++;
        if (CA == 1) P(SB);    //阻塞B组进程
        V(SAB);
        V(SA);

        read F;

        P(SAB);
        CA --;
        if (CA == 0) V(SB);    //唤醒B组进程
        V(SAB);
    }

    readB {
        P(SB);
        P(SAB);
        CB ++;
        if (CB == 1) P(SA);
        V(SAB);
        V(SB);

        read F;

        P(SAB);
        CB --;
        if (CB == 0) V(SA);
        V(SAB);
    }

    但这个按如下步骤会造成死锁:
    A1: P(SA);    //成功,继续
    B1: P(SB);    //成功
        P(SAB);    //成功
        CB++;
        if(CB == 1) P(SA); //阻塞,等待V(SA)唤醒
    A1: P(SAB); //阻塞,等待V(SAB),死锁...

    =================================
    交换P(SAB) 和 P(SA), P(SB)的位置同样会有死锁。
    readA {
        P(SAB);
        P(SA);
        CA ++;
        if (CA == 1) P(SB);    //阻塞B组进程
        V(SAB);
        V(SA);

        read F;

        P(SAB);
        CA --;
        if (CA == 0) V(SB);    //唤醒B组进程
        V(SAB);
    }

    readB {...
    按如下步骤:
    A1: P(SAB); //成功;
        P(SA); //SUCCESS
        ... P(SB);
        V(SAB);
        V(SA);
        read F;

    B1: P(SAB); //成功
        P(SB); //被A1阻塞中,等待V(SB);
    A1: P(SAB); //阻塞,以下A1读完要唤醒SB,结果又被 B1的P(SAB)阻塞,死锁


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/24 14:57:00
     
     Maxwin_ 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:85
      门派:XML.ORG.CN
      注册:2006/12/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Maxwin_发送一个短消息 把Maxwin_加入好友 查看Maxwin_的个人资料 搜索Maxwin_在『 操作系统原理 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Maxwin_的博客2
    发贴心情 
    SAB: 互斥信号量
    SA, SB用于A B两组进程的同步信号量
    CA, CB用于记录各组读进程数的共享变量

    SAB = SA = SB = 1;
    CA = CB = 0;

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/24 15:06:00
     
     Maxwin_ 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:85
      门派:XML.ORG.CN
      注册:2006/12/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Maxwin_发送一个短消息 把Maxwin_加入好友 查看Maxwin_的个人资料 搜索Maxwin_在『 操作系统原理 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Maxwin_的博客3
    发贴心情 
    想了下,这样应该没问题了
    SAB: 用于A B两组互斥的信号量
    SA:A组对CA进行操作的互斥信号量
    SB:B组对CB进行操作的互斥信号量
    CA, CB用于记录当前各组中在读进程

    SAB = SA = SB = 1;
    CA = CB = 0;

    readAi {
     P(SAB);
     P(SA);
     CA ++;
     IF (CA == 1) P(SB);
     V(SA);
     V(SAB);

     READ F;

     P(SA);
     CA --;
     IF (CA == 0) V(SB);
     V(SA);
    }

    readBi {
     P(SAB);
     P(SB);
     CB ++;
     IF (CB == 1) P(SA);
     V(SB);
     V(SAB);

     READ F;

     P(SB);
     CB --;
     IF (CB == 0) V(SA);
     V(SB);
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/24 16:10:00
     
     小南航 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:56
      门派:XML.ORG.CN
      注册:2006/12/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给小南航发送一个短消息 把小南航加入好友 查看小南航的个人资料 搜索小南航在『 操作系统原理 』的所有贴子 引用回复这个贴子 回复这个贴子 查看小南航的博客4
    发贴心情 
    惭愧
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/5 16:47:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 操作系统原理 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/6 13:33:29

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

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