整形信号量
记录型信号量
这些wait 都是-1 signal都是+1
不同的是
整型信号量wait先判断小于0然后再-1 signal没有判断直接+1
记录型信号量wait先-1 再判断小于0 如果小于0 就从这个小于0的地方锁上 block
然后signal的时候先 +1 如果小于等于0 然后再从锁住的地方解锁。
P 操作wait(): S.value = S.value - 1; if S.value < 0 then block(S,L)
V操作signal(): S.value = S.value + 1; if S.value <= 0 then wakeup(S,L)
定义信号量semaphore代表可用资源实体的数 量。又叫信号灯。
当≥0,代表可供并发进程使用的资源实体数
当<0,表示正在等待使用该资源的进程数。
建立一个信号量必须经过说明,信号量所代表的意义
赋初值
建立相应的数据结构,以便指向等待使用临界 区的进程。
除初值外,信号量的值仅能由标准原子操作P、V 操作来改变。
PV操作是荷兰语通过和释放的意思。
还有其他类型的信号量 但是不怎么常用
信号量题目做题的一般方法:
1、分析问题,找出同步、互斥关系
2、根据资源设置信号量变量
3、写代码,并注意P、V操作
4、检查代码,模拟机器运行,然后再改代码
信号量值为0的点是限制的关键所在; 成对使用P和V原语(在有先后关系 的两个进程中),不能次序错误、 重复或遗漏,否则同步顺序出错。
其实和上个博客写的差不多 主要还是看明白题目,然后弄清各种进程之间的互斥 同步关系
然后 根据资源定义信号量 其实这个信号量也可以看成代码之间的控制 类似于算法上的东西吧 需要用到就设置一个(最好也根据资源)。
最后再模拟事件走一遍代码 要全面考虑各种情况,然后再改代码。就好了。
信号量集:
引入原因: 每次只能获得或释放一个单位的资 源,低效; 某些时候资源分配有下限的限制; 修改:在大于可分配设置的下界值t 前提下,每次可分配d个。