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({});
- 其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感
- WCF服务端运行时架构体系详解[上篇]
- 使命必达: 深入剖析WCF的可靠会话[编程篇](下)
- 在网页里让文本框只能输入数字的一种方法。外加回车换Tab
- 如何用Python从零开始实现简单的线性回归
- 使命必达: 深入剖析WCF的可靠会话[编程篇](上)
- 页面回发后,让页面自动滚动到指定位置的一种简单的方法
- [自定义服务器控件] 第二步:下拉列表框。
- WCF服务端运行时架构体系详解[中篇]
- [自定义服务器控件] 第三步:CheckBoxList。
- 用Keras通过Python进行卷积神经网络的手写数字识别
- 反射的另类实现。(不知道这么用还算不算反射了?)
- 如何让普通变量也支持事务回滚?
- What is "Type" in managed heap?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手把手教你:将ClickHouse集群迁至云上
- 直播中台iLiveSDK终端框架演变之路
- ClickHouse 数据导入实战:Kafka 篇
- pipeAsyncFunctions
- 【python-leetcode287-循环排序】寻找重复的数
- 聊聊claudb的list command
- 【python-leetcode448-循环排序】找到所有数组中消失的数字
- input/change/composition/keydown事件详解
- isSameDate
- 【python-leetcode57-区间合并】插入区间
- 【python-leetcode56-区间合并】合并区间
- 【python-leetcode876-快慢指针】链表的中间节点
- vuejs之springboot+vue+element-ui之分页显示相关信息
- vuejs之vue和springboot后端进行通信
- vuejs之springboot+vue+element-ui之添加信息