有乙個許多程序共享的資料區,這個資料區可以是乙個檔案或者主存的一塊空間;有一些只讀取這個資料區的程序(reader)和一些只往資料區寫資料的程序(writer),此外還需要滿足以下條件:
(1) 任意多個讀程序可以同時讀這個檔案;
(2) 一次只有乙個寫程序可以往檔案中寫;
(3) 如果乙個寫程序正在進行操作,禁止任何讀進程度檔案。
乙個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。
readcount //讀者計數器
var rwmutex, rmutex =1,
1;int readcount =0;
cobegin
procedure reader_i procedure writer_j // i,j = 1,2,….
while true then while true then
begin begin
p(rmutex);p
(rwmutex)
; 寫更新;
readcount ++;
v(rwmutex);if
(readcount ==1
) end
p(rwmutex)
;// rwmutex 大於0時,自動從此處執行
v(rmutex)
; 讀資料;
p(rmutex)
; readcount --;
if(readcount ==0
)v(rwmutex);v
(rmutex)
;end
coend
讀程序
寫程序1)多個讀者可以同時進行讀
2)寫者必須互斥(只允許乙個寫操作,也不允許讀寫同時進行《rwmutex只有乙份》)
3)寫者優先於讀者(一方面,一旦有寫者(正在執行),則後續讀者
必須等待,另一方面v(rwmutex)喚醒時 優先考慮寫者,其次才是讀者)
假設讀者數是固定的
,演算法如下:
rwmutex:用於寫者與其他讀者/寫者互斥的訪問共享資料
rmutex:該訊號量初始值設為10,表示最多允許10個讀者程序同時進行讀操作
var rwmutex, rmutex: semaphore :=1
,10;
cobegin
procedure reader_i procedure writer_j
begin begin // j = 1,2,….
p(rwmutex);p
(rwmutex);p
(rmutex)
;for
(i =
1;i <=
10;i ++)
p(rmutex)
;//讀資料
v(rwmutex)
;//禁止新讀者,並等待已進入的讀者退出讀程序
// 寫更新;
v(rmutex)
;for
(i =
1;i <=
10;i ++)
v(rmutex)
;end //恢復允許rmutex值為10,喚醒讀程序
v(rwmutex)
endcoend
讀程序
寫程序
PV 操作 讀者寫者問題
讀者 寫者問題 訊號量的英文叫做 semaphore,是乙個用於在程序間傳遞的特殊便量,通常定義成乙個結構體,其中包含乙個整形變數,以及乙個佇列,如下 struct semaphore一般來說,s 0,s 表示可用資源數量。執行一次 p 操作意味著請求分配乙個單位資源,因此 s 當 s 0 表示已經...
作業系統PV操作及讀者寫者問題
作業系統pv操作及讀者寫者問題 目錄 1 訊號量 2 p v操作原語可描述為以下式子 3 解釋 4 互斥模式原理 5 同步模式原理 6 讀者寫者問題 1 訊號量 pv操作與訊號量的處理有關,訊號量是表示資源的實體,是乙個與佇列有關的整型變數,其值只能由p v操作來改變。作業系統利用訊號量對程序和資源...
作業系統PV操作及讀者寫者問題
作業系統pv操作及讀者寫者問題 目錄 1 訊號量 2 p v操作原語可描述為以下式子 3 解釋 4 互斥模式原理 5 同步模式原理 6 讀者寫者問題 1 訊號量 pv操作與訊號量的處理有關,訊號量是表示資源的實體,是乙個與佇列有關的整型變數,其值只能由p v操作來改變。作業系統利用訊號量對程序和資源...