作業系統學習筆記 讀者寫者問題

2021-08-27 03:15:43 字數 1574 閱讀 4145

動機:共享資料的訪問

兩種型別使用者:讀者,不需要修改資料;寫者,讀取和修改資料

問題的約束:

允許同一時間有多個讀者,但在任何時候只有乙個寫者;當沒有寫者時,讀者才能訪問資料;當沒有讀者和寫者時,寫者才能訪問資料;在任何時候只能有乙個執行緒可以操作共享變數。

多個併發程序的資料集共享:讀者-唯讀資料集;他們不執行任何更新。寫者 - 可以讀取和寫入

共享資料: 資料集data;訊號量countmutex,保證rcount的互斥,初始化為1;訊號量writemutex,對寫者的互斥保護,初始化為1;整數rcount代表多少個讀者,初始化為0

訊號量實現,讀者優先

寫者

sem_wait(writemutex);

write;

sem_post(writemutex);

讀者sem_wait(countmutex); 對rcount做互斥保護

if(rcount == 0)

sem_wait(writemutex); //將read包起來

++rcount;

sem_post(countmutex); 所以這一句和上面的那句包起來中間的部分

read;

sem_wait(countmutex); 對rcount做互斥保護

--rcount;

if(rcount==0)

sem_post(writemutex); //將read包起來

sem_post(countmutex); 所以這一句和上面的那句包起來中間的部分

用管程實現寫者優先

偽碼:

database::read()

database::write()

管程的狀態變數:

ar = 0;  //活動的讀者

aw = 0; //活動的寫者

wr = 0; //等待的讀者

ww = 0; //等待的寫者

condition oktoread;//兩個條件變數

condition oktowrite;

lock lock; //互斥

讀者的實現:

public database::read()

private database::startread()

ar++;//讀者增加乙個

lock.release();

}private database::doneread()

lock.release();

}

寫者:

public database::write()

private database::startwrite()

aw++;

lock.release();

}private database::donewrite()

else if(wr>0)

lock.release();

}

讀者寫者問題 作業系統

動機 共享資料的訪問 兩種型別使用者 讀者 不需要修改資料 寫者 讀取和修改資料 問題的約束 允許同一時間有多個讀者,但在任何時候只有乙個寫者 當沒有寫者是讀者才能訪問資料 當沒有讀者和寫者時,寫者才能訪問資料 在任何時候只有乙個執行緒能操作共享變數 多個併發程序的資料集共享 rcount 有多少個...

作業系統 讀者 寫者問題

讀者間可以同時訪問資源 任一寫者必須與其他寫者或者讀者互斥訪問共享資源 分析 寫者與任一程序互斥訪問共享資源 讀者互斥訪問readcount變數 1申請對檔案的使用權p mutex 2寫檔案 3釋放對檔案的使用權v mutex 設正在讀的讀者個數readcount初 0 1第乙個讀者來 申請對檔案的...

作業系統 讀者寫者問題

乙個資料檔案或記錄可以被多個程序共享。唯讀的程序為 reader程序 其他程序為 writer程序 允許多個物件同時讀乙個共享物件,但是不允許乙個writer程序和其他reader程序同時共享物件。使用記錄性訊號量解決讀者與寫者問題 互斥訊號量wmutex 實現reader與writer程序間在讀或...