4.信号量

整型信号量

  • 整型数

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为资源信号量,其初值表示某类资源的数目。

S.value>=0时,表示系统当中可用资源数目;it

S.value<0时,表示等待使用资源的进程个数。io

  • wait操做:申请一个单位资源
Procedure wait(S)
Var S:semaphore;
begin
	S.value:=S.value-1;
	If S.value<0 then block(s,L)//将S信号放进阻塞队列L中
end
  • singal操做:释放一个单位资源
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时:只容许一个进程访问临界资源,是互斥信号量

AND型信号量(可解决记录型信号量的死锁问题)

基本思想:map

将进程在整个运行中须要的全部资源,一次性所有分配给进程,待进程使用完后一块儿释放。

  • 在wait中加入AND条件,又称AND同步或同时wait操做,SWait
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;
相关文章
相关标签/搜索