計算機操作系統 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);//可以讓讀者讀
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章