進程同步---信號量機制
一種非常有效的進程同步機制。
1.整型信號量
整型信號量定義爲一個用於表示資源數目的整型量S,它與一般整形量不同,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問,分別被稱爲P、V操作。
可描述爲:
wait(S): while S<=0 do no=op; //如果S<=0,就一直循環,不斷地進行測試
S:=S-1;
signal(S): S:=S+1;
wait(S)和signal(S)是兩個原子操作,因此,它們在執行時是不可中斷的。整型信號量機制並未遵循讓權等待準則,一直循環不會釋放處理機,進程處於“忙等”狀態。
2.記錄型信號量
記錄型信號量機制中,信號量S中包含代表資源數目的整型變量value和進程鏈表指針L,L用於鏈接所有等待訪問此資源的進程。
它包含的上述兩個數據項可描述爲:
type semaphore=record
value:integer; //表示系統中某類資源的數目,又稱資源信號量。對它的每次wait操作,則進程請求一個單位的該類資源,系統中可分配的此資源減一。
L:list of process; //等待此資源的進程鏈表
end
相應地,wait(S)和signal(S)操作可描述爲:
procedure wait(S)
var S:semaphore;
begin
S.value:=S.value-1; //系統中可分配的此類資源減少一個
if S.value<0 then block(S.L); //當資源信號量小於0,表示此類資源已分配完畢,此進程調用block原語,進行自我阻塞,放棄處理機,並插入到信號量鏈表S.L中。
end
可見,此機制遵循了“讓權等待”準則。此時S.value的絕對值表示在該信號量鏈表中已阻塞進程的數目。
procedure signal(S)
var S: semaphore;
begin
S.value:=S.value+1; //表示進程釋放一個單位資源,使系統中可供分配的該類資源數目增加一個。
if S.value<=0 then wakeup(S.L); //若value加1後仍是S.value<=0,表示在該信號量鏈表中,仍有等待該資源的進程被阻塞,故應調用wakeup原語,將S.L鏈表中 的第一個等待進程喚醒。
end
如果S.value的初值爲1,表示只允許一個進程訪問臨界資源,此時的信號量轉化爲互斥信號量,用於進程互斥。