信號量解決進程同步互斥習題

獨木橋問題

一個主修動物行爲學、輔修計算機科學的學生參加了一個課題,調查花果山的猴子是否能被教會理解死鎖。他找到一處峽谷,橫跨峽谷拉了一根繩索(假設爲南北方向)這樣猴子就可以攀着繩索越過峽谷。只要它們朝着相同的方向,同一時刻可以有多隻猴子通過。但是如果在相反的方向上同時有猴子通過則會發生死鎖(這些猴子將被卡在繩索中間,假設這些猴子無法在繩索上從另一隻猴子身上翻過去)。如果一隻猴子想越過峽谷,它必須看當前是否有別的猴子在逆向通過。請使用P/V 操作來解決該問題。

semaphore bridge,Smutex,Nmutex;
int count;//表示在橋上過橋的數量
bridge.value=1;//橋是臨界資源,爲表示不同方向互斥訪問
Smutex.value=1;//count是臨界資源,往南走的進程使用時得保護臨界區
Nmutex.value=1;//count是臨界資源,往北走的進程使用時得保護臨界區
count=0;//初始時過橋的猴子數量爲0
cobegin
	//往南方向走的猴子進程
	procedure South()
	{
		wait(Smutex);//保護臨界區
		if(count==0)
			wait(bridge);//封鎖橋,不讓反方向的進入橋
		count++;
		signal(Smutex);//保護臨界區
		...
		go through the bridge
		...
		wait(Smutex);//保護臨界區
		count--;
		if(count==0)
			signal(bridge);	//本方向的猴子走完了,釋放橋
		signal(Smutex);//保護臨界區
	}
	//往北方向走的猴子進程
	procedure North()
	{
		wait(Nmutex);//保護臨界區
		if(count==0)
			wait(bridge);//封鎖橋,不讓反方向的進入橋
		count++;
		signal(Nmutex);//保護臨界區
		...
		go through the bridge
		...
		wait(Nmutex);//保護臨界區
		count--;
		if(count==0)
			signal(bridge);	//本方向的猴子走完了,釋放橋
		signal(Nmutex);//保護臨界區
	}
coend

蘋果橘子問題

桌子上只有一個盤子,每次只能放入一種水果;爸爸專門向盤子裏放入蘋果,媽媽專門向盤子裏放入橘子,一個兒子專吃盤子中的橘子,一個女兒專吃盤子中的蘋果;試用信號量機制解決進程的互斥同步問題

//這裏分析,對於father和mother而言,盤子是臨界資源,同一時刻只能有一個往盤子裏放水果
//對於mother和son而言,存在着同步關係,mother放完orange等着son吃,son吃完等着mother放
//同理,對於father和daughter而言,存在同步關係
//這裏定義五個信號量,plate表示盤子是互斥的
//m,s用來表示mother和son交叉喚醒
//f,d用來表示father和daughter交叉喚醒
semaphore plate,m,s,f,d;
plate.value=1;
m.value=f.value=1;
s.value=d.value=0;
cobegin
procedure father()
{
	while(1)
	{
		wait(plate);//判斷盤子是否可用,鎖定盤子
		wait(f);//有點奇怪,感覺f在這裏很雞肋
		...
		put  an apple into plate
		...
		signal(d);//通知daughter有apple可吃
		signal(plate);//釋放盤子
	}
}
procedure mother()
{
	while(1)
	{
		wait(plate);//鎖定盤子
		wait(m);//有點奇怪,感覺m在這裏很雞肋
		...
		put an orange into plate
		...
		signal(s);//通知son可以吃orange
		signal(plate);//釋放盤子
	}
}
procedure son()
{
	while(1)
	{
		wait(s);//等待mother放好orange
		...
		get an orange from plate to eat
		...
		signal(m);//通知mother繼續放
	}
}
procedure daughter()
{
	while(1)
	{
		wait(d);//等待father放好apple
		...
		get an apple from plate to eat
		...
		signal(f);//通知father繼續放
	}
}
coend

快餐廳問題

一個快餐廳有四類職員
(1)領班:接受顧客點菜
(2)廚師:準備顧客的飯菜
(3)打包工:將做好的飯菜打包
(4)出納員:收款並提交食品
每個職員可以被看作一個進程,請用信號量機制解決進程互斥同步問題

//P1->P2->P3->P4->P1這是一個同步問題
//定義四個信號量S1,S2,S3,S4
semaphore S1,S2,S3,S4;
S1.value=1;
S2.value=S3.value=S4.value=0;
cobegin
procedure P1
{
	wait(S1);
	...
	接受顧客點菜
	...
	signal(S2);
}
procedure P2
{
	wait(S2);
	...
	準備顧客的飯菜
	...
	signal(S3);
}
procedure P3
{
	wait(S3);
	...
	將做好的飯菜打包
	...
	signal(S4);
}
procedure P4
{
	wait(S4);
	...
	收款並提交食品
	...
	signal(S1);
}
coend
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章