作業系統 讀者寫者問題

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

有兩組併發程序:讀者和寫者,共享一個檔案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);

//解鎖

}}