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

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 计算机科学论坛计算机理论与工程『 计算机考研交流 』 → 大家讨论写者优先的这段程序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 12564 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 大家讨论写者优先的这段程序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客楼主
    发贴心情 大家讨论写者优先的这段程序

    在网上看见有人写的这段写者优先的程序,感觉是错的,大家认为呢?

    设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据
                        rmutex  用于读者互斥的访问读者计数器readcount                                                   nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作

    var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ;
    int readcount = 0;
    cobegin
           readeri begin  // i=1,2,….
                  P(rwmutex);
                  P(rmutex);
                  Readcount++;
                  If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
                  V(rmutex);
                  V(rwmutex); // 及时释放读写互斥信号量,允许其它读、写进程申请资源
                  读数据;
                  P(rmutex);
                  Readcount--;
                  If (readcount == 0) V(nrmutex); //所有读者退出,允许写更新
                  V(rmutex);
           End

           Writerj begin // j = 1,2,….
                  P(rwmutex);  // 互斥后续其它读者、写者
                  P(nrmutex);  //如有读者正在读,等待所有读者读完
                  写更新;
                  V(nrmutex);   //允许后续新的第一个读者进入后互斥写操作
                  V(rwmutex);  //允许后续新读者及其它写者
           End
    Coend


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/14 18:11:00
     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客2
    发贴心情 
    这个解法是在网上看见的,后来发现前沿考试研究室出的考研操作系统分册里也是同样的解法,觉得很奇怪。考虑了一下,基本可以肯定方法是错的。
    正确的解法要麻烦一些。
    大家讨论啊。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/14 21:49:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客3
    发贴心情 
    这个算法好像没有错。
    确实是很标准“写者优先”的。
    按这个算法,如果读者在读的过程中,有写者进入排队,以后的读者就无法继续进入了。需要等写者写完后,后面的读者才有继续读。

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/14 23:11:00
     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客4
    发贴心情 
    考虑一下这种情况,如果一个读进程正在这个区域的某个位置:
                  P(rmutex);
                  Readcount++;
                  If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
                  V(rmutex);
    如果这个时刻又有读进程,写进程来临,显然它们都等待在信号量rwmutex的队列中,如果想要写者优先,必须让这个当前读进程作V(rwmutex)时,让写进程先写,但是如果等待的读进程先来,写进程无法跨越的。

    再有,当一个读进程已准备开始读,而现在只有写进程等待,没有读进程等待,因此当前读进程做V(rwmutex)时就将写进程推进到信号量nrmutex的队列里,这时当读进程正在读时,后续来多个读进程,都可以读,但此时写进程却始终等在队列里,只要读进程不断地来,写进程永远没有机会。因此这个算法不满足“写者优先”的条件,即如有写进程来临,它要尽可能快地写,所以读进程在读完时,应该先看队列里有没有写进程等待,如有,要让写进程跨过队列先写。
    大家想想吧,据说这个算法还是斯大林操作系统上的算法。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 13:27:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客5
    发贴心情 
    不存在你说的“同时到的问题”。信号量操作是不可中断的,所以要么是写者先P(rwmutex),要么是读者先P(rwmutex),必然有个先后的。

    假设目前已经有读者(不妨记为R1)在读,新的读者R2和新的写者W1几乎同时到达。但他们中必有一个先执行P(rwmutex)。如果是R2先执行,那么W1会被挂在rwmutex上,而R2可以顺利的执行完相关操作,开始进行读操作。如果是W1先执行,那么R2会被挂在rwmutex上,这时W1可以成功地执行P(rwmutex),并被挂在nrmutex上,直到所有在关键区中的读进程退出(注意,R2被挂在rwmutex上的,根本没有机会修改readcount,所以目前不属于“在关键区中的读进程”)。

    你所说的前一个问题:“如果这个时刻又有读进程,写进程来临,显然它们都等待在信号量rwmutex的队列中,如果想要写者优先,必须让这个当前读进程作V(rwmutex)时,让写进程先写,但是如果等待的读进程先来,写进程无法跨越的。”实际上是假定R2比W1先到一点,这时本来就应该让R2进入,W1不可能剥夺比它先到的进程的控制权。假如R2比W1后到一点,R2就进不去了。

    第二个问题:“再有,当一个读进程已准备开始读,而现在只有写进程等待,没有读进程等待,因此当前读进程做V(rwmutex)时就将写进程推进到信号量nrmutex的队列里,这时当读进程正在读时,后续来多个读进程,都可以读,”这显然是不对的。后续的每一个读进程都得先P(rwmutex),可这时由于写进程运行过P(rwmutex),rwmutex已经是0(或者是负数)了,后面的读进程都会挂在rwmutex上,怎么可能“都可以读”呢?

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 13:54:00
     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客6
    发贴心情 
    对,第二个问题我看错了。

    “实际上是假定R2比W1先到一点,这时本来就应该让R2进入,W1不可能剥夺比它先到的进程的控制权。假如R2比W1后到一点,R2就进不去了“
    对于这句话,我想我们应该理解一下什么叫优先。
    大家都在队列中等待,如果先到先服务,就谈不上什么优先了。
    你觉得呢?

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 14:59:00
     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客7
    发贴心情 
    操作系统-内核与设计原理《第四版》---- 电子工业出版社
    这本书里提出的算法才是真正的写者优先算法,因为它解决了在队列中等待的写进程能跨过读进程先执行写操作。我觉得大家不要太相信书,应该先找其算法的漏洞。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 15:05:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客8
    发贴心情 
    我觉得优先是相对于以前的“只要有读进程在关键区中,之后所有的读进程就可以直接进去,写者永远等待”的情况而言的。

    不过我明白你的意思。这个程序确实可以改进得让写者“更优先”一点。比如:

    1、当有多个新的读进程同时到达时,他们会在P(rwmutex)处排队,以便依次访问Readcount计数器,这时,新来的writer应该可以乘机跨越这个队列,抢先访问关键区。
    2、如果目前是写者W1正在访问关键区,在排队的进程中既有读者也有写者,则W1访问结束后,由下一个写者继续进入关键区。

    你所说的“真正的写者优先”是指实现了上述两个功能的,是吗?

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 16:31:00
     
     ychj 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:58
      积分:440
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ychj发送一个短消息 把ychj加入好友 查看ychj的个人资料 搜索ychj在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看ychj的博客9
    发贴心情 
    Logician, 对,我就是这个意思,呵呵。
    这个算法如果说"写者优先",可能是相对读者优先算法来说的。
    终于遇到知音了,呵呵。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/10/15 18:03:00
     
     Logician 帅哥哟,离线,有人找我吗?天蝎座1984-10-28
      
      
      威望:9
      头衔:逻辑爱好者
      等级:研三(收到IBM CRL的Offer了)(版主)
      文章:1219
      积分:10357
      门派:IEEE.ORG.CN
      注册:2005/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Logician发送一个短消息 把Logician加入好友 查看Logician的个人资料 搜索Logician在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给Logician  访问Logician的主页 引用回复这个贴子 回复这个贴子 查看Logician的博客10
    发贴心情 
    嗯,去翻了一下你说的那本书,那个算法确实很不错。:)

    ----------------------------------------------
    Three passions, simple but overwhelmingly strong, 
    have governed my life: the longing for love, the
    search for knowledge, and unbearable pity for the
    suffering of mankind.
                                - Bertrand Russell

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

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

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