PV操作系列 讀者寫者問題

2021-10-07 03:55:56 字數 1805 閱讀 6085

有乙個許多程序共享的資料區,這個資料區可以是乙個檔案或者主存的一塊空間;有一些只讀取這個資料區的程序(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操作來改變。作業系統利用訊號量對程序和資源...