作業系統 讀者寫者問題

2022-06-23 16:39:37 字數 2217 閱讀 9790

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

讀者可以同時讀取檔案

讀者和寫者不能同時對檔案進行操作

兩個讀者也不能同時對檔案進行操作

讀者優先模型:

讀者不釋放寫者的臨界區資源,寫者就不能進行操作

int readcount=0;//

讀程序計數

semaphore writeblock,mutex;//

訊號量

writeblock=1;//

寫者在進入和退出使用的臨界資源

mutex=1; //

讀者者在進入和退出使用的臨界資源 ,保證readcount的唯一變化

//讀者程序

process reader_i( );

p(mutex);

//上鎖,讀者-讀者互斥

readcount--;

if(readcount==0)//

當讀者全部退出,則釋放寫者的臨界區

v(writeblock); //

解鎖,釋放寫者臨界區

v(mutex); //

解鎖,釋放讀者臨界區資源 }//

寫者程序

process writer_j( );

v(writeblock);

}

寫者優先模型:

entemutex是為了保證寫者可以在讀者退出quemutex臨界區是第一時間搶占,並且當寫者佇列還有人的時候不釋放
int readcount;//

讀者數量

int writecount;//

寫者數量

semaphore entemutex,quemutex,fmutex,wcount,rcount;//

訊號量

entemutex=1;//

避免寫者與讀者之間競爭

quemutex=1;//

讀者和寫者在進入和退出使用的臨界資源 (保證唯讀或只寫)

fmutex=1;//

寫者的臨界區

wcount=1;//

寫者在進入和退出使用的臨界資源

rcount=1;//

讀者者在進入和退出使用的臨界資源 ,保證readcount的唯一變化

//讀者執行緒

reader()

p(rcount);

//讀者退出

readcount--;

if(readcount == 0)//

解鎖 v(fmutex);//

允許寫者進入

v(rcount);//

解鎖讀者-讀者 }}

//寫者執行緒

writer()

v(fmtex);

//操作完成,解鎖

p(wcount);

//退出,進入臨界區 (寫者出門)

writecount--;

if(readcount == 0) //

當寫者為0時,釋放臨界區給讀者使用

v(quemutex);//

只要writecount不為0就不是放,寫者優先

v(wcount);//

解鎖 }

}

公平競爭:

semaphore writeblock,mutex;//

訊號量

int readcount;//

讀者數量

quemutex=1;//

讀者和寫者進入和退出使用的臨界資源

rcount=1;//

讀者在進入和退出使用的臨界資源

fmutex=1;//

寫者在進入和退出使用的臨界資源

reader()

p(rcount);

//上鎖,讀者-讀者互斥

if(readcount == 0

) v(fmutex);

//解鎖,允許讀者進入

v(rcount);//

解鎖 }}

writer()

v(fmtex);

//解鎖

v(qmutex);

//解鎖

}}

讀者寫者問題 作業系統

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

作業系統 讀者 寫者問題

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

作業系統 讀者寫者問題

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