1. 程式人生 > >計算機作業系統 2.5對經典程序的同步問題 的簡單解釋

計算機作業系統 2.5對經典程序的同步問題 的簡單解釋

首先簡單說明以下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);//可以讓讀者讀
}
}