一)整型信号量
整型数
P操作(wait)原语
V 操作(signal)原语
wait(s)
while s <= 0 do no-op
s = s-1
sigal(s):
s= s +1;
注:s 小于等于0就不能使用s。
wait(s)和signal(s)都是原子操作。
只要信号量s<=0就不断测试,不满足让权等待。
(二)记录型信号量
包含两个数据项:
type semaphore = record
value:integer;
L:list of process;(L是链表,是一个阻塞队列,该队列正在等待使用资源)
end
s.value为资源信号量初始值:某类资源的数目。
(a) s.value >= 0 代表系统中可用的资源数目。
(b) s.value <=0 其绝对值代表系统中等待使用资源的进程的个数。
(c) s.value初始值为1时:只允许一个进程访问临界资源,是互斥信号量。
wait操作:申请一个单位资源。
Procedure: wait(s)
var s:semaphore = ;
begin
s.value = s.value-1;
if s.value < 0 then block(s,L)//使得正在执行的进程进入阻塞状态。
end
signal操作:释放一个单位资源
Procedure:signal(s);
begin:
s.value = s.value+1;
if s.value <=0 then wakeup(s,L)//唤醒一个阻塞的进程。
end
记录型信号量可能会打来死锁状态。
AND型信号量
基本思路:将进程在整个运行中需要的所有资源,一次性全部分配给进程,待进程使用完后一起释放。
在wait中加入AND条件
又称AND同步或同时wait操作:Swait
Swait(