**
讀者一寫者問題是乙個用訊號量實現的經典程序同步問題。在系統中,乙個資料集( 如檔案或記錄) 被幾個併發程序共享,這些執行緒分兩類,一部分只要求進行復操作,稱之為「讀者」;另一類要求寫或修改操作,我們稱之為「寫者「。
一般而言,對乙個資料集,為了保證資料的完整性、正確性,允許多個讀者程序同時訪問,但是不允許乙個寫者程序同其它任何乙個程序(讀者或者寫者)同時訪問,而這類問題就稱之為」讀者-寫者「問題。
讀者優先的演算法在作業系統相關的書籍中都有介紹,這是一種最簡單的解決辦法:當沒有寫程序正在訪問共享資料集時,讀程序可以進入訪問,否則必須等待。而讀者優先的演算法存在「餓死寫者」執行緒的問題:只要有讀者不斷到來,寫者就要持久地等待,直到 所有的讀者都讀完且沒有新的讀者到來時寫者才能寫資料集。而在很多情況下我們需要避免」餓死寫者「,故而採用寫者優先演算法:
在寫者優先演算法中,我們要實現的目標是:
1.要讓讀者與寫者之間、以及寫者與寫者之問要互斥地訪同資料集;
2.在無寫程序到來時各讀者可同時訪問資料集;
3.在讀者和寫者都等待時訪問時寫者優先.
一種演算法實現:
我們將用兩個不同的互斥訊號量分別實現讀者與寫者間的互斥及各寫者程序間的互斥:以互斥訊號量wmutex實現各寫者問的互斥,互斥訊號量rmutex實現各讀者與寫者問的互斥;
設定兩個整型變數wcount和rcount分別記錄等待的寫者數和正在讀的讀者數,因wcount、rcount都是共享變數,因此還要設定兩個互斥訊號量mutl和mut2以實現程序對這兩個變最的互斥訪問.
用訊號量機制實現的寫者優先的演算法如 :
[c-sharp] view plain copyvar 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);
讀操作:
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。
讀者寫者問題的寫者優先演算法
演算法如下 有讀者 reader 和寫者 writer 兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀程序可以同時對檔案執行讀操作 只允許乙個寫程序往檔案中寫資訊...
讀者寫者問題 讀者優先 python測試)
總結乙個資料物件若被多個併發程序所共享,且其中一些程序只要求讀該資料物件的內容,而另一些 程序則要求寫操作,對此,把只想讀的程序稱為 讀者 而把要求寫的程序稱為 寫者 在 讀者 寫著問題中,任何時刻要求 寫者 最多隻允許有乙個,而讀者則允許有多個。因為多個 讀者的行為互不干擾,他們只是讀資料,而不改...
讀者寫者問題
生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...