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;