訊號量解決讀者 寫者問題

2021-08-17 12:16:51 字數 1018 閱讀 8645

有兩組併發程序:讀者和寫者,共享檔案f,要求:

(1)允許多個讀者同時對檔案進行讀操作

(2)只允許乙個寫者對檔案進行寫操作

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

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

單純的引入訊號量並不能解決此問題,必須引入計數器readcount對讀程序計數,mutex是用於對計數器readcount操作的互斥訊號量,writeblock表示是否允許寫的訊號量。

訊號量解決讀者-寫者問題

int readcount = 0;                      /*讀程序計數*/

semaphore writeblock,mutex;

writeblock = 1;mutex = 1;

cobegin

process reader_i()

process writer_j()

coend;

此解法中讀者是優先的,當存在讀者時,寫者將被延遲,且只要有乙個讀者活躍,隨後而來的讀者都將被允許訪問此檔案,從而導致寫者長時間等待,並有可能出現寫者飢餓現象。

增加訊號量並修改此程式,讓寫者與讀者平等:

int readcount = 0;                      /*讀程序計數*/

semaphore writeblock,mutex;

writeblock = 1;mutex = 1;

semaphore s = 1;

cobegin

process reader_i()

process writer_j()

coend;

分析

假設程序佇列:r1、w1、w2、r2、r3

當r1剛剛執行完v(s),w1程序若排程會卡在p(writeblock),而w2r2r3想要執行,均會卡在p(s),當r1讀完,v(writeblock)完成,w1可以執行,以此類推,r1w1w2r2r3按順序排程。

用訊號量解決同步互斥問題 讀者寫者問題

os老師上課在講解讀者和寫者問題時,一般會按照三個層次展開講解。根據訊號量的分布和控制邏輯,大體可以將讀者 寫者問題按由易到難分成如下這三大類 讀者優先,課本上的寫法屬於佔位後讀優先,與佔位前讀優先 絕對讀優先一起,均歸於此類 讀寫公平,根據讀寫程序的到達先後順序嚴格執行fcfs排程 寫優先,包括佔...

讀者寫者問題

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

讀者寫者問題

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