以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 计算机考研交流 』 (http://bbs.xml.org.cn/list.asp?boardid=67) ---- 大家讨论写者优先的这段程序 (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=38901) |
-- 作者:ychj -- 发布时间:10/14/2006 6:11:00 PM -- 大家讨论写者优先的这段程序 在网上看见有人写的这段写者优先的程序,感觉是错的,大家认为呢? 设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据 var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ; Writerj begin // j = 1,2,…. |
-- 作者:ychj -- 发布时间:10/14/2006 9:49:00 PM -- 这个解法是在网上看见的,后来发现前沿考试研究室出的考研操作系统分册里也是同样的解法,觉得很奇怪。考虑了一下,基本可以肯定方法是错的。 正确的解法要麻烦一些。 大家讨论啊。 |
-- 作者:Logician -- 发布时间:10/14/2006 11:11:00 PM -- 这个算法好像没有错。 确实是很标准“写者优先”的。 按这个算法,如果读者在读的过程中,有写者进入排队,以后的读者就无法继续进入了。需要等写者写完后,后面的读者才有继续读。
|
-- 作者:ychj -- 发布时间:10/15/2006 1:27:00 PM -- 考虑一下这种情况,如果一个读进程正在这个区域的某个位置: P(rmutex); Readcount++; If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作 V(rmutex); 如果这个时刻又有读进程,写进程来临,显然它们都等待在信号量rwmutex的队列中,如果想要写者优先,必须让这个当前读进程作V(rwmutex)时,让写进程先写,但是如果等待的读进程先来,写进程无法跨越的。 再有,当一个读进程已准备开始读,而现在只有写进程等待,没有读进程等待,因此当前读进程做V(rwmutex)时就将写进程推进到信号量nrmutex的队列里,这时当读进程正在读时,后续来多个读进程,都可以读,但此时写进程却始终等在队列里,只要读进程不断地来,写进程永远没有机会。因此这个算法不满足“写者优先”的条件,即如有写进程来临,它要尽可能快地写,所以读进程在读完时,应该先看队列里有没有写进程等待,如有,要让写进程跨过队列先写。
|
-- 作者:Logician -- 发布时间:10/15/2006 1:54:00 PM -- 不存在你说的“同时到的问题”。信号量操作是不可中断的,所以要么是写者先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上,怎么可能“都可以读”呢? |
-- 作者:ychj -- 发布时间:10/15/2006 2:59:00 PM -- 对,第二个问题我看错了。 “实际上是假定R2比W1先到一点,这时本来就应该让R2进入,W1不可能剥夺比它先到的进程的控制权。假如R2比W1后到一点,R2就进不去了“ |
-- 作者:ychj -- 发布时间:10/15/2006 3:05:00 PM -- 操作系统-内核与设计原理《第四版》---- 电子工业出版社 这本书里提出的算法才是真正的写者优先算法,因为它解决了在队列中等待的写进程能跨过读进程先执行写操作。我觉得大家不要太相信书,应该先找其算法的漏洞。 |
-- 作者:Logician -- 发布时间:10/15/2006 4:31:00 PM -- 我觉得优先是相对于以前的“只要有读进程在关键区中,之后所有的读进程就可以直接进去,写者永远等待”的情况而言的。 不过我明白你的意思。这个程序确实可以改进得让写者“更优先”一点。比如: 1、当有多个新的读进程同时到达时,他们会在P(rwmutex)处排队,以便依次访问Readcount计数器,这时,新来的writer应该可以乘机跨越这个队列,抢先访问关键区。 你所说的“真正的写者优先”是指实现了上述两个功能的,是吗? |
-- 作者:ychj -- 发布时间:10/15/2006 6:03:00 PM -- Logician, 对,我就是这个意思,呵呵。 这个算法如果说"写者优先",可能是相对读者优先算法来说的。 终于遇到知音了,呵呵。 |
-- 作者:Logician -- 发布时间:10/15/2006 10:19:00 PM -- 嗯,去翻了一下你说的那本书,那个算法确实很不错。:) |
-- 作者:DavidPotter -- 发布时间:10/17/2006 12:15:00 PM -- 是不是读者进入临界区之前,看看有没有写者进程到来? |
-- 作者:Logician -- 发布时间:10/17/2006 9:36:00 PM -- 差不多吧。 这个PV程序用到的信号量数量达到了令人发指的5个之多。 其中2个用于实现读、写计数器的互斥访问。 2个用于维护读、写进程的队列。 还有1个是写进程用于阻止读进程进入的。 当第一个写进程到达时,就把最后那个信号量P一下,然后读进程就卡往了。 等最后一个写进程离开时,再把最后那个信号量V一下,读进程继续访问。 |
-- 作者:Supremgoooo -- 发布时间:10/18/2006 10:15:00 PM -- 对!这个程序不好的关键就在于此。
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
78.125ms |