「讀者-寫者問題」的寫者優先算法實現

轉自http://blog.csdn.net/zoudaokou2006/article/details/3966694

讀者一寫者問題是一個用信號量實現的經典進程同步問題。在系統中,一個數據集( 如文件或記錄) 被幾個併發進程共享,這些線程分兩類,一部分只要求進行復操做,稱之爲「讀者」;另外一類要求寫或修改操做,咱們稱之爲「寫者「。

通常而言,對一個數據集,爲了保證數據的完整性、正確性,容許多個讀者進程同時訪問,可是不容許一個寫者進程同其它任何一個進程(讀者或者寫者)同時訪問,而這類問題就稱之爲」讀者-寫者「問題。

讀者優先的算法在操做系統相關的書籍中都有介紹,這是一種最簡單的解決辦法:當沒有寫進程正在訪問共享數據集時,讀進程能夠進入訪問,不然必須等待。而讀者優先的算法存在「餓死寫者」線程的問題:只要有讀者不斷到來,寫者就要持久地等待,直到 全部的讀者都讀完且沒有新的讀者到來時寫者才能寫數據集。而在不少狀況下咱們須要避免」餓死寫者「,故而採用寫者優先算法:

在寫者優先算法中,咱們要實現的目標是:

1.要讓讀者與寫者之間、以及寫者與寫者之問要互斥地訪同數據集;

2.在無寫進程到來時各讀者可同時訪問數據集;

3.在讀者和寫者都等待時訪問時寫者優先.

一種算法實現:
咱們將用兩個不一樣的互斥信號量分別實現讀者與寫者間的互斥及各寫者進程間的互斥:以互斥信號量Wmutex實現各寫者問的互斥,互斥信號量Rmutex實現各讀者與寫者問的互斥;
設置兩個整型變量Wcount和Rcount分別記錄等待的寫者數和正在讀的讀者數,因Wcount、Rcount都是共享變量,所以還要設置兩個互斥信號量Mutl和Mut2以實現進程對這兩個變最的互斥訪問.

用信號量機制實現的寫者優先的算法如 :算法

[c-sharp] view plain copy 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(Mut1); //當即釋放Mut1,使寫者能夠隨時申請到Mut1 
Wait(Mut2); Rcount:=Rcount+1; If Rcount=1 then Wait(Fmutex); //第一個讀者進入時,申請Fmutex;若有寫者,第一個讀者會阻塞在此處 
Signal(Mut2);

讀操做:spa

Wait(Mut2); Rcount:=Rcount-1; If Rcount=0 then Signal(Fmutex); //最後一個讀者退出時,釋放Fmutex 
Singal(Mut2); end 

代碼解釋:

1: 
讀者、寫者均按照Mut一、Fmutex的順序申請信號量。

2:
寫者得到Fmutex後,直至最後一個寫者釋放Fmutex,讀者均被阻塞。
讀者得到Fmutex後,直至最後一個讀者(不包含因爲Mut1被阻塞的讀者)釋放Fmutex,寫者均被阻塞。

3.
讀者申請到Mut1後當即釋放;
而寫者申請到Mut1後,就一直佔用不放,直至申請到Fmutex。

4.總結
Fmutex的做用就是寫者、讀者間的互斥;
Mut1的額外做用就是幫助寫者優先競爭到Fmutex。操作系統

相關文章
相關標籤/搜索