計算機作業系統 2.5對經典程序的同步問題 的簡單解釋
阿新 • • 發佈:2018-12-23
首先簡單說明以下P.V.操作的作用
P操作:訊號量– –;
V操作:訊號量++;
生產者—消費者問題:
empty:表示空緩衝區的數目,其初值為緩衝池的大小n,表示消費者已把緩衝池中全部產品取走,有n個空緩衝區可用。
full:表示滿緩衝區的數目(即產品數目),其初值為0,表示生產者尚未把產品放入緩衝池,有0個滿緩衝區可用。
mutex:互斥訊號量,表示程序對緩衝池的互斥使用,及任何時間點內只能由一個程序訪問緩衝池。
int in=0,out=0; //生產數,消費數
item buffer[n]; //緩衝區數
semaphore mutex=1, empty=n, full=0 ;
/***************************************
生產者
***************************************/
void producer(){
while(1){
P(empty); //空資源減一
P(mutex); //該程序對緩衝區進行操作
buffer[in] = nextp; //給第in個緩衝區寫資料
in = (in + 1) % n; //in+1,如果超出範圍返回第一個
V(mutex); //終止程序對緩衝區的佔用
V(full); //非空閒資源加一
}
}
/***************************************
消費者
***************************************/
void consumer(){
while(1){
P(full); //非空資源減一
P(mutex); //該程序對緩衝區進行操作
nextc= buffer[out]; //給第out個緩衝區寫資料
out = (out+ 1) % n; //out+1,如果超出範圍返回第一個
V(mutex); //終止程序對緩衝區的佔用
V(empty); //空閒資源加一
}
}
哲學家進餐問題
chopstick:筷子是臨界資源所以設定筷子為訊號
量,又因為有5只筷子所以定義訊號量陣列,切互斥所以初始值設定為1,此外哲學家(程序)對筷子的操作相同。
semaphore chopstick[5]={1 ,1,1,1,1};
void activity(){
while(1){
P(chopstick[i]); //使用第i只筷子
P(chopstick[(i+1)%5]); //使用第i+1只筷子
//eat
V(chopstick[i]); //釋放第i只筷子
Vchopstick[(i+1)%5]); //釋放第i+1只筷子
}
}
讀者-作者問題
readcount:共享變數,記錄當前正在讀資料集的讀程序數目,初值為0。
rmutex :讀互斥訊號量,表示讀程序互斥地訪問共享變數readcount,初值為1.
wmutex:寫互斥訊號量,表示寫程序與其它程序(讀、寫)互斥地訪問資料集,初值為1.
注:只要有一個Reader程序在讀,便不允許Writer程序寫。所以,當Readcount=0及無Reader程序在讀時,Reader程序才需要執行Wait(Wmutex)操作。若wait(Wmutex)操作成功,Reader程序便可去讀,相應的,做Readcount+1操作。
semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
/*************************
讀者
**************************/
void reader(){
while(1){
P(rmutex);//多一個讀者,並不允許在多一個讀者
if(readcount == 0) P(wmutex);//第一位讀者阻止寫者程序
readcount++;
V(rmutex);//允許在多一個讀者
// perfrom read operation
P(rmutex);//少一個讀者,並不允許在少一個讀者
readcount--;
if(readcount == 0) V(wmutex);//最後一個讀者開放寫者程序
V(rmutex);//允許在少一個讀者
}
}
/*************************
作者
**************************/
void writer(){
while(1){
P(wmutex);//開始寫作,讀者等待
V(wmutex);//可以讓讀者讀
}
}