4.信号量 原

时间:2022-06-19
本文章向大家介绍4.信号量 原,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

整型信号量

  • 整型数

S<=0时,信号无效;

P(wait)原语

V(singal)原语

等待原语:

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时,表示系统当中可用资源数目;

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

  • 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型信号量(可解决记录型信号量的死锁问题)

基本思想:

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

  • 在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;

(adsbygoogle = window.adsbygoogle || []).push({});