信号量是什么?
信号量的基本应用
实现多个进程互斥(注意点)
(1)互斥信号量mutex初值为1;
(2)每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
(3)必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏:
遗漏P原语则不能保证互斥访问
遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程);
实现进程间的前趋关系(有序)(注意点)
信号量值为0的点是限制的关键所在;
成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错。
区别整型、记录型、AND型信号量以及信号量集
(1)整型信号量(符合“有限等待”原则,不符合“让权等待”原则)
信号量定义为一个整型量;
根据初始情况赋相应的值;
仅能通过两个原子操作来访问。
P操作 wait(S):
While S<=0 do no-op;
S:=S-1;
V操作 signal(S):
S:=S+1;
(2)记录型信号量
信号量结构信息发生变化
不仅要有值的处理,还有队列的处理。
此时形成记录型数据结构,包括两部分:
整型变量value(代表资源数目)
进程链表L(链接所有等待进程)
P、V操作也有所变化(熟练使用记录集型信号量,其wait,signal具体做了什么?)
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)
(3)AND型信号量
解决思想:一次性分配给进程所需资源,用完一起释放。Wait操作时对它所有需要的资源都要判断,有AND条件,故称“AND同步”、“同时wait”。
(4)信号量集
在大于可分配设置的下界值t前提下,每次可分配d个。