读者-写着问题中写者优先的实现
2014-07-01 01:27
288 查看
读者一写者问题是一个用信号量实现的经典进程同步问题。在系统中,一个数据集( 如文件或记录) 被几个并发进程共享,这些线程分两类,一部分只要求进行复操作,称之为“读者”;另一类要求写或修改操作,我们称之为“写者“。
一般而言,对一个数据集,为了保证数据的完整性、正确性,允许多个读者进程同时访问,但是不允许一个写者进程同其它任何一个进程(读者或者写者)同时访问,而这类问题就称之为”读者-写者“问题。
读者优先的算法在操作系统相关的书籍中都有介绍,这是一种最简单的解决办法:当没有写进程正在访问共享数据集时,读进程可以进入访问,否则必须等待。而读者优先的算法存在“饿死写者”线程的问题:只要有读者不断到来,写者就要持久地等待,直到 所有的读者都读完且没有新的读者到来时写者才能写数据集。而在很多情况下我们需要避免”饿死写者“,故而采用写者优先算法:
在写者优先算法中,我们要实现的目标是:
1.要让读者与写者之间、以及写者与写者之问要互斥地访同数据集;
2.在无写进程到来时各读者可同时访问数据集;
3.在读者和写者都等待时访问时写者优先.
一种算法实现:
我们将用两个不同的互斥信号量分别实现读者与写者间的互斥及各写者进程间的互斥:以互斥信号量Wmutex实现各写者问的互斥,互斥信号量Rmutex实现各读者与写者问的互斥;
设置两个整型变量Wcount和Rcount分别记录等待的写者数和正在读的读者数,因Wcount、Rcount都是共享变量,因此还要设置两个互斥信号量Mutl和Mut2以实现进程对这两个变最的互斥访问.
用信号量机制实现的写者优先的算法如 :
[c-sharp] view
plaincopy
Var Mut1,Mut2,Wmutex,Fmutex:Semaphore;
Rcount,Wcount:integer;
Mut1:=Mut2:=WMutex:=Fmutex:=1;
Rcount:=Wcount:=0;
//Fmutex --> 读者写者互斥
//WMutex --> 写者互斥
//Mut1 --> access to Rcount && 竞争Fmutex
//Mut2 --> access to Wcount
Writer:begin
Wait(Mut1);
Wcount:=Wcount+1;
If Wcount=1 then Wait(Fmutex); //如有读者,写者阻塞在此处
Signal(Mut1);
Wait(WMutex);
写操作;
Signal(Wmutex);
Wait(Mut1);
Wcount:=Wcount-1;
If Wcount=0 then Signal(Fmutex);
Signal(Mut1);
end
Reader:begin
Wait(Mut1); //读者需要先申请Mut1,如果有写者在等待Fmutex,则读者被阻塞,写者优先
Signal(Mut1); //立即释放Mut1,使写者可以随时申请到Mut1
Wait(Mut2);
Rcount:=Rcount+1;
If Rcount=1 then Wait(Fmutex); //第一个读者进入时,申请Fmutex;如有写者,第一个读者会阻塞在此处
Signal(Mut2);
读操作;
Wait(Mut2);
Rcount:=Rcount-1;
If Rcount=0 then Signal(Fmutex); //最后一个读者退出时,释放Fmutex
Singal(Mut2);
end
代码解释:
1:
读者、写者均按照Mut1、Fmutex的顺序申请信号量。
2:
写者获得Fmutex后,直至最后一个写者释放Fmutex,读者均被阻塞。
读者获得Fmutex后,直至最后一个读者(不包含由于Mut1被阻塞的读者)释放Fmutex,写者均被阻塞。
3.
读者申请到Mut1后立即释放;
而写者申请到Mut1后,就一直占用不放,直至申请到Fmutex。
4.总结
Fmutex的作用就是写者、读者间的互斥;
Mut1的额外作用就是帮助写者优先竞争到Fmutex。
代码的思路比较混乱,欢迎大家指正错误。
看到一篇文章,也是讨论读者写者问题的,思路比我这篇清晰的多,文章地址如下:http://blog.csdn.net/cz_hyf/archive/2009/08/13/4443551.aspx
一般而言,对一个数据集,为了保证数据的完整性、正确性,允许多个读者进程同时访问,但是不允许一个写者进程同其它任何一个进程(读者或者写者)同时访问,而这类问题就称之为”读者-写者“问题。
读者优先的算法在操作系统相关的书籍中都有介绍,这是一种最简单的解决办法:当没有写进程正在访问共享数据集时,读进程可以进入访问,否则必须等待。而读者优先的算法存在“饿死写者”线程的问题:只要有读者不断到来,写者就要持久地等待,直到 所有的读者都读完且没有新的读者到来时写者才能写数据集。而在很多情况下我们需要避免”饿死写者“,故而采用写者优先算法:
在写者优先算法中,我们要实现的目标是:
1.要让读者与写者之间、以及写者与写者之问要互斥地访同数据集;
2.在无写进程到来时各读者可同时访问数据集;
3.在读者和写者都等待时访问时写者优先.
一种算法实现:
我们将用两个不同的互斥信号量分别实现读者与写者间的互斥及各写者进程间的互斥:以互斥信号量Wmutex实现各写者问的互斥,互斥信号量Rmutex实现各读者与写者问的互斥;
设置两个整型变量Wcount和Rcount分别记录等待的写者数和正在读的读者数,因Wcount、Rcount都是共享变量,因此还要设置两个互斥信号量Mutl和Mut2以实现进程对这两个变最的互斥访问.
用信号量机制实现的写者优先的算法如 :
[c-sharp] view
plaincopy
Var Mut1,Mut2,Wmutex,Fmutex:Semaphore;
Rcount,Wcount:integer;
Mut1:=Mut2:=WMutex:=Fmutex:=1;
Rcount:=Wcount:=0;
//Fmutex --> 读者写者互斥
//WMutex --> 写者互斥
//Mut1 --> access to Rcount && 竞争Fmutex
//Mut2 --> access to Wcount
Writer:begin
Wait(Mut1);
Wcount:=Wcount+1;
If Wcount=1 then Wait(Fmutex); //如有读者,写者阻塞在此处
Signal(Mut1);
Wait(WMutex);
写操作;
Signal(Wmutex);
Wait(Mut1);
Wcount:=Wcount-1;
If Wcount=0 then Signal(Fmutex);
Signal(Mut1);
end
Reader:begin
Wait(Mut1); //读者需要先申请Mut1,如果有写者在等待Fmutex,则读者被阻塞,写者优先
Signal(Mut1); //立即释放Mut1,使写者可以随时申请到Mut1
Wait(Mut2);
Rcount:=Rcount+1;
If Rcount=1 then Wait(Fmutex); //第一个读者进入时,申请Fmutex;如有写者,第一个读者会阻塞在此处
Signal(Mut2);
读操作;
Wait(Mut2);
Rcount:=Rcount-1;
If Rcount=0 then Signal(Fmutex); //最后一个读者退出时,释放Fmutex
Singal(Mut2);
end
代码解释:
1:
读者、写者均按照Mut1、Fmutex的顺序申请信号量。
2:
写者获得Fmutex后,直至最后一个写者释放Fmutex,读者均被阻塞。
读者获得Fmutex后,直至最后一个读者(不包含由于Mut1被阻塞的读者)释放Fmutex,写者均被阻塞。
3.
读者申请到Mut1后立即释放;
而写者申请到Mut1后,就一直占用不放,直至申请到Fmutex。
4.总结
Fmutex的作用就是写者、读者间的互斥;
Mut1的额外作用就是帮助写者优先竞争到Fmutex。
代码的思路比较混乱,欢迎大家指正错误。
看到一篇文章,也是讨论读者写者问题的,思路比我这篇清晰的多,文章地址如下:http://blog.csdn.net/cz_hyf/archive/2009/08/13/4443551.aspx
相关文章推荐
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 有名信号量实现读者-写者问题(读者优先)
- “读者-写者问题”的写者优先算法实现
- 读者-写者同步问题的写者优先实现
- William Stallings 《操作系统内核和设计原理》书中Linux下C语言实现读者写者问题(写者优先)代码
- readers and writers problem 读者写者问题 写者优先 C++实现
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- “读者-写者问题”的写者优先算法实现
- 讨论个问题吧,只用MUTEX,你能实现一个写者优先的读写锁吗?
- 经典同步问题linux下的C实现:生产者-消费者问题,读者-写者问题,哲学家问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- JAVA多线程实现读者写者问题
- 读者-写者问题 写者优先与公平竞争
- 多线程学习系列三 多线程实现读者和写者问题
- (转)很有借鉴意义!读者写者问题--使用信号量的读者优先与写者优先程序分析
- 操作系统算法:如何利用信号量实现优先级(从读者写者问题引发的联想)
- 操作系统笔记《7》-------生产者、消费者问题 。读者、写者问题 程序实现
- IPC之读者写者问题:写者优先
- wait, notify, notifyAll, 简单数组模拟队列实现读者写者问题。
- IPC之读者写者问题:读者优先