2.3信號量機制
1、信號量機制是一種卓有成效的進程同步工具。
(一)整型信號量
1.信號量定義為一個整型量;
2.根據(jù)初始情況賦相應的值;
3.僅能通過兩個原子操作來訪問。
P操作:? wait(S){
????????????? While (S<=0)? ? do no-op;
? ? ? ? ? ? ? ?S--;
? ? ? ? ? ? ? ? ? ? }
V操作:? signal(S){
????????????? S++;
? ? ? ? ? ? ? ? }
4、利用整型信號量實現(xiàn)對臨界資源的互斥使用
5、整型信號量符合有限等待原則但不符合讓權等待原則。
(二)記錄型信號量
1、不僅要有值的處理,還有隊列的處理。此時形成記錄型數(shù)據(jù)結(jié)構,包括兩部分:
1)整型變量value(代表資源數(shù)目)? ? ? ? ? ? 2)進程鏈表L(鏈接所有等待進程)
2、定義信號量semaphore代表可用資源實體的數(shù)量。
? ? ?Value>0,表示當前可用資源的數(shù)量;
? ? ?Value≤0,其絕對值表示等待使用該資源的進程數(shù),即在該信號量隊列上排隊的PCB的個數(shù)。
3、先修改資源數(shù),再判斷處理。
P操作:wait(){
? ? ? ? ? ? ? S->value--;
? ? ? ? ? ? ?if? (S->value< 0)? then? block(S->list);
? ? ? ? ? ? ? }
V操作: signal(){
? ? ? ? ? ? S->value++;
? ? ? ? ? ?if? (S.value<= 0) then wakeup(S->list);
? ? ? ? ? }
4、建立一個信號量必須經(jīng)過說明,包括
1)信號量所代表的意義
2)賦初值
3)建立相應的數(shù)據(jù)結(jié)構,以便指向等待使用臨界區(qū)的進程。
(三)信號量的基本應用
1、實現(xiàn)進程互斥
1)互斥信號量mutex初值為1;
2)每個進程中將臨界區(qū)代碼置于P(mutex)和V(mutex)原語之間
3)必須成對使用P和V原語(在同一進程中),不能次序錯誤、重復或遺漏:
? ? ?遺漏P原語則不能保證互斥訪問,遺漏V原語不能在使用臨界資源之后將其釋放。
2、實現(xiàn)進程間的前趨關系(有序)
1)信號量值為0的點是限制的關鍵所在;
2)成對使用P和V原語(在有先后關系的兩個進程中),不能次序錯誤、重復或遺漏,否則同步出錯。
(四)AND型信號量
1、出現(xiàn)原因:
一些應用往往需要兩個或多個共享資源,而不是前述的一個資源。進程同時要求的共享資源越多,發(fā)生死鎖可能性越大。
2、解決思想:
? 一次性分配給進程所需資源,用完一起釋放。Wait操作時對它所有需要的資源都要判斷。
3、
Swait(S1,S2,…, Sn)
???if(S1 >=1 and … and Sn>=1 )then
???????for i:=1 to n do
??????????Si:= Si -1 ;
???????endfor
???else
??????將進程阻塞在第一個不能滿足資源信號量的隊列中。
? ?endif
Ssignal(S1, S2, …, Sn)
???for i:=1 to n do
??????Si:= Si +1 ;
??????喚醒所以與si相關的阻塞進程
? ?endfor???
(五)信號量集
1、引入原因:
1)每次只能獲得或釋放一個單位的資源,低效;
2)某些時候資源分配有下限的限制;
修改:在大于可分配設置的下界值t前提下,每次可分配d個
2、AND信號量機制上加以擴充,每種資源參數(shù)有三:
S為信號量(現(xiàn)有值);
t為下限值(現(xiàn)有不能少于該條件);
d為需求值;
Swait(S1,t1,d1, …, Sn, tn, dn)
???if S1>=t1 and… and Sn>=tn then
???????for i:=1 to n do
??????????Si:= Si - di ;
???????endfor
???else
…
???endif
Ssignal(S1, d1, …, Sn, dn)
???for i:=1 to n do
??????Si:= Si +di ;
??????….
???endfor
(六)信號量題目做題一般方法:
1.分析問題,找出同步、互斥關系
2.根據(jù)資源設置信號量變量
3.寫出代碼過程,并注意P、V操作的位置
4.檢查代碼,模擬機器運行,體驗信號量的變化和程序運行過程是否正確。