S<=0时,信号无效;
P(wait)原语
V(singal)原语
等待原语:
wait(S):
while S<=0 do no-operation
S:=S-1;
释放原语:
singal(S):
S:=S+1;
type semaphore = record
value:integer
L:list of process
end
S.value>=0时,表示系统当中可用资源数目;
S.value<0时,表示等待使用资源的进程个数。
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时:只允许一个进程访问临界资源,是互斥信号量
基本思想:
将进程在整个运行中需要的所有资源,一次性全部分配给进程,待进程使用完后一起释放。
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;
(adsbygoogle = window.adsbygoogle || []).push({});