S<=0時,信號無效;測試
P(wait)原語code
V(singal)原語blog
等待原語:隊列
wait(S): while S<=0 do no-operation S:=S-1;
釋放原語:進程
singal(S): S:=S+1;
wait(s)和singal(s)是原子操做資源
只要信號量S<=0就不斷測試,不知足讓權等待同步
type semaphore = record value:integer L:list of process end
S.value>=0時,表示系統當中可用資源數目;it
S.value<0時,表示等待使用資源的進程個數。io
Procedure wait(S) Var S:semaphore; begin S.value:=S.value-1; If S.value<0 then block(s,L)//將S信號放進阻塞隊列L中 end
Procedure singal(S): Var S:semaphore; begin S.value:=S.value+1;//S是信號量類型的 If S.value <= 0 then wakeup(S,L) end //S.value>=0:表示系統中可用的資源數量 //S.value<0:其值表示已阻塞的進程數量 //S.value初值爲1時:只容許一個進程訪問臨界資源,是互斥信號量
基本思想:map
將進程在整個運行中須要的全部資源,一次性所有分配給進程,待進程使用完後一塊兒釋放。
SWait(S1,S2,……,Sn) if S1 >=1 and Sn >= 1 then for i:=1 to n do Si:= Si - 1; end for else 當初次發現Si<1就把該進程放入等待隊列並將其程序計數器置於SWait操做的開始位置 endif
釋放操做:
SSingal(S1,S2,……,Sn) for i:=1 to n do Si:=Si+1; 將全部等待Si的進程由等待隊列取出放入到就緒隊列 end for;