操作系統筆記------進程同步(2)

信號量機制

描述

信號量機制是一種高效的進程同步工具,其發展由整型信號量到記錄型信號量再到"信號量集"機制,廣泛用於單處理機和多處理機以及計算機網絡。

整型信號量

顧名思義,其定義了一個用於表示資源數目的整型量S來控制資源訪問。

PV原子操作

爲了實現同步,有定義了兩個標準的原子操作,P(wait),V(signal),分別對資源進行請求與釋放。

大致的代碼描述如下:

wait()
{
	while(S<=0);
	S--;
}

signal()
{
	S++;
}

由於是兩個原子性的操作,所以兩個函數的實現是無法被打斷的,當進程提出請求(wait)就會根據S的值來判斷,S初始值爲1,當有一個進程獲取訪問後,S–,S<=0,就會陷入while的循環等待中,直至上一個進程訪問結束,S++;便可跳出循環獲取訪問權限。

記錄型信號量

記錄型信號量相比較與整型信號量,多了一個阻塞進程隊列,當進程請求時會對請求進行判斷,如果沒有可用資源,就會將其放入阻塞隊列中等待,等到資源空閒後會從隊列中對其進行喚醒。

代碼描述如下:

int S ;//資源數,爲了好理解還是預設爲1吧
struct process *list;

wait()
{
	S--;
	if(S<0)//S<0表示沒有可以的資源則將其對應進程進行阻塞等待
	{
		block(list);
	}
}

signal()
{
	S++;
	if(S<=0)//釋放使用的資源之後檢查是否還有進程在申請,如果有就從隊列中喚醒。
	{
		wakeup(list);
	}
}

參數意義

在之前的例子中S的數量是有具體的意義的,當S<0時表示沒有可用的資源了,當S大於0時,其值就是資源的數量,當S的數值小於0時表示沒有可用的資源了,其絕對值的大小就是被阻塞的進程數量。
當系統中某個資源的數量大於一時,我們就可以將S的數量設爲資源數目,也可以使其正常同步。

死鎖

之前的兩種信號量都是對單個資源的請求,但是實際的使用中進程往往一次性會請求多個臨界資源。
現在假設使用之前的信號量機制對兩個臨界資源進行管理,有進程A,B訪問這兩個資源R1,R2,這時假定其請求順序是A請求R1,同時B請求R2,且都獲得了訪問權,但是要想讓進程工作,必須要對這兩個資源進行訪問,這時B請求R1,但是R1被A佔用了,A請求R2,同樣被A佔了,所以就出現了死鎖狀態。
進程集合中的每一個進程都在等待只能由本集合中的其他進程才能引發的事件,那麼該組進程是死鎖的。

AND型信號量

爲了打破進程對多個資源的訪問出現的死鎖情況,提出了AND同步機制,其策略是對進程請求的資源實行一次性的分配策略,也就是說要獲得資源訪問權限必須是同時獲得所需的全部資源權限,一次性分配全部,用完一次性釋放。這些獲取與釋放資源的操作也是原子操作,在判斷所有資源是否都處於可用狀態時會使用AND判斷,所以得名。
代碼描述如下:

int S[n] ;//資源集合,初始設爲1
struct process *list;//阻塞隊列
wait()
{
	if(S[0]==1&&S[1]==1&&......&&S[n-1]==1)//資源的集體空閒
	{
		int i;
		for(i=0;i<n;i++)
		{
			S[i]=0;
		}
	}else
	{
		block(list);//阻塞等待
	}
	
}

signal()
{
	for(i=0;i<n;i++)
	{
		S[i]=1;//同時釋放
	}
	wakeup(list);//喚醒阻塞進程	
}

信號量集

在之前的信號量操作中,我們都是以零散的方式去請求資源,這樣往往會提高出現死鎖的概率,同時效率也不高,所以我們可以通過改進資源的申請方式來提高效率,減小發生死鎖的概率。

修改策略:之前是每次申請一個資源,現在我們設置一個資源申請的閾值,在這一閾值之下的我們不予以分配,超出這個閾值的請求,進行統一處理。通過修改原有的wait與signal原語,使我們可以對多種資源每個資源的不同數量的多個請求實現一次性分配,這樣可以大大減少原語的使用次數,提高效率。

這樣的話,我們每次都要去檢測資源的需求量,如果大於其設置的值並且其含有可用資源數目足夠就一次性分配,如果小於設置的值就不予分配。
大致的描述可以使用形如:wait(S,d,d)來表示,S爲信號量,第一個d爲設置的閾值,若達到該值則進行分配,之後的d表示如果當前的可用資源數(信號量)小於d時就不進行分配。

之前的記錄型可以表示爲wait(S,1,1),只有一個可用,請求數必須至少爲1。
除此之外,還有一個wait(S,1,0),表示一個可用開關,多個進程可以同時發出需求,但是當信號量爲0時不予分配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章