前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >4.信号量 原

4.信号量 原

作者头像
青木
发布2019-03-12 17:01:27
3850
发布2019-03-12 17:01:27
举报

整型信号量

  • 整型数

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({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整型信号量
  • 记录型信号量
  • AND型信号量(可解决记录型信号量的死锁问题)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档