讀者寫者問題

2021-07-30 08:03:20 字數 2029 閱讀 6293

讀者寫者問題是作業系統中經典的互斥問題:一塊資料被多個讀者和寫者的訪問,需要考慮讀寫互斥、寫寫互斥(可以同時由多個讀者讀取)。具體的又可以分為讀者優先和寫者優先兩類。

讀者優先演算法:

當新的讀者到來的時候,若當前正有讀者在進行讀操作,則該讀者無需等待前面的寫操作完成,直接進行讀操作。

設定兩個互斥訊號量: l

rwmutex

用於寫者與其他讀者

/寫者互斥的訪問共享資料 l

rmutex 

用於讀者互斥的訪問讀者計數器

readcount

var rwmutex, rmutex

:semaphore := 1,1;

int readcount = 0; 


cobegin
      

readeri begin  //i=1,2,….


p(rmutex);
 

if (readcount == 0)

p(rwmutex);


readcount++;

v(rmutex);
             

讀共享資料;

p(rmutex);
             

readcount--;
             

if (readcount == 0)

v(rwmutex);
 

v(rmutex);
      

endwriterj begin // j = 1,2,….


p(rwmutex);
             

寫共享資料;

v(rwmutex);
      

end 


coend

寫者優先: 1

)多個讀者可以同時進行讀 2

)寫者必須互斥(只允許乙個寫者寫,也不能讀者寫者同時進行) 3

)寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)

設定三個互斥訊號量:

l  rwmutex

用於寫者與其他讀者

/寫者互斥的訪問共享資料

l  rmutex 

用於讀者互斥的訪問讀者計數器

readcount

l  nrmutex

用於寫者等待已進入讀者退出,所有讀者退出前互斥寫操作

var rwmutex, rmutex

,nrmutex

:semaphore := 1,1

,1;

int readcount = 0;

cobegin
      

readeri begin  //i=1,2,….


p(rwmutex);
             

p(rmutex);
             
             

if (readcount == 0)

p(nrmutex); //

有讀者進入,互斥寫操作

readcount++;

v(rmutex);


v(rwmutex); //

及時釋放讀寫互斥訊號量,允許其它讀、寫程序申請資源、

讀共享資料;

p(rmutex);
             

readcount--;
             

if (readcount == 0)

v(nrmutex); //

所有讀者退出,允許寫更新

v(rmutex);
      

end

writerj begin // j = 1,2,….

p(rwmutex);  //

互斥後續其它讀者、寫者

p(nrmutex);  //

如有讀者正在讀,等待所有讀者讀完

寫共享資料;

v(nrmutex);   //

允許後續新的第乙個讀者進入後互斥寫操作

v(rwmutex);  //

允許後續新讀者及其它寫者

end


coend

讀者寫者問題

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...

讀者寫者問題

問題簡述 讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 1 寫 寫互斥,即不能有兩個寫者同時進行寫操作。2 讀 寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。3 讀 讀允許,即可以有乙個或多個讀者在讀。讀者優先的附加限制 如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則...

讀者 寫者問題

讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...