(操作系統原理·第三章)讀者-寫者問題

問題描述:

有兩組併發進程:讀者和寫者,共享一個文件F,要求:

(1)允許多個讀者可同時對文件執行讀操作;

(2)只允許一個寫者往文件中寫信息;

(3)任一寫者在完成寫操作之前不允許其他讀者或寫者工作;

(4)寫者執行寫操作前,應讓已有的寫者和讀者全部退出。


分析:

單純使用信號量不能解決讀者與寫者問題,必須引入計數器rc 對讀進程計數,mutex 是用於對計數器rc 操作的互斥信號量,W 表示是否允許寫的信號量。


算法:

var rc: integer;
W,mutex: semaphore;
rc := 0; /* 讀進程計數 */
W := 1;
mutex := 1;
procedure read;
begin
P(mutex);
rc := rc + 1;
if rc=1 then P(W);
V(mutex);
讀文件;
P(mutex);
rc := rc - 1;
if rc = 0 then V(W);
V(mutex);
end;
procedure write;
begin
P(W);
寫文件;
V(W);
end;


cobegin
process readeri;
process writerj;
coend.
process readeri;
begin
read;
end.
process writerj
begin
write;
end.

在上面的解法中,讀者是優先的,當存在讀者時,寫操作將被延遲,並且只要有一個讀者活躍,隨後而來的讀者都將被允許訪問文件,從而,導致了寫進程長時間等待,並有可能出現寫進程被餓死。增加信號量並修改上述程序可以得到寫進程具有優先權的解決方案,能保證當一個寫進程聲明想寫時,不允許新的讀進程再訪問共享文件。
爲了有效解決讀者寫者問題,有的操作系統專門引進了讀者/寫者鎖。讀者/寫者鎖允許多個讀者同時以只讀方式存取有鎖保護的對象;或一個寫者以寫方式存取有鎖保護的對象。當一個或多個讀者已上鎖後,此時形成了讀鎖,寫者將不能訪問有讀鎖保護的對象;當鎖被請求者用於寫操作時,形成了寫狀態,所有其他進程的讀寫操作必須等待。

發佈了28 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章