2.3信号量机制
1、信号量机制是一种卓有成效的进程同步工具。
(一)整型信号量
1.信号量定义为一个整型量;
2.根据初始情况赋相应的值;
3.仅能通过两个原子操作来访问。
P操作: wait(S){
While (S<=0) do no-op;
S--;
}
V操作: signal(S){
S++;
}
4、利用整型信号量实现对临界资源的互斥使用
5、整型信号量符合有限等待原则但不符合让权等待原则。
(二)记录型信号量
1、不仅要有值的处理,还有队列的处理。此时形成记录型数据结构,包括两部分:
1)整型变量value(代表资源数目) 2)进程链表L(链接所有等待进程)
2、定义信号量semaphore代表可用资源实体的数量。
Value>0,表示当前可用资源的数量;
Value≤0,其绝对值表示等待使用该资源的进程数,即在该信号量队列上排队的PCB的个数。
3、先修改资源数,再判断处理。
P操作:wait(){
S->value--;
if (S->value< 0) then block(S->list);
}
V操作: signal(){
S->value++;
if (S.value<= 0) then wakeup(S->list);
}
4、建立一个信号量必须经过说明,包括
1)信号量所代表的意义
2)赋初值
3)建立相应的数据结构,以便指向等待使用临界区的进程。
(三)信号量的基本应用
1、实现进程互斥
1)互斥信号量mutex初值为1;
2)每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
3)必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏:
遗漏P原语则不能保证互斥访问,遗漏V原语不能在使用临界资源之后将其释放。
2、实现进程间的前趋关系(有序)
1)信号量值为0的点是限制的关键所在;
2)成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步出错。
(四)AND型信号量
1、出现原因:
一些应用往往需要两个或多个共享资源,而不是前述的一个资源。进程同时要求的共享资源越多,发生死锁可能性越大。
2、解决思想:
一次性分配给进程所需资源,用完一起释放。Wait操作时对它所有需要的资源都要判断。
3、
Swait(S1,S2,…, Sn)
if(S1 >=1 and … and Sn>=1 )then
for i:=1 to n do
Si:= Si -1 ;
endfor
else
将进程阻塞在第一个不能满足资源信号量的队列中。
endif
Ssignal(S1, S2, …, Sn)
for i:=1 to n do
Si:= Si +1 ;
唤醒所以与si相关的阻塞进程
endfor
(五)信号量集
1、引入原因:
1)每次只能获得或释放一个单位的资源,低效;
2)某些时候资源分配有下限的限制;
修改:在大于可分配设置的下界值t前提下,每次可分配d个
2、AND信号量机制上加以扩充,每种资源参数有三:
S为信号量(现有值);
t为下限值(现有不能少于该条件);
d为需求值;
Swait(S1,t1,d1, …, Sn, tn, dn)
if S1>=t1 and… and Sn>=tn then
for i:=1 to n do
Si:= Si - di ;
endfor
else
…
endif
Ssignal(S1, d1, …, Sn, dn)
for i:=1 to n do
Si:= Si +di ;
….
endfor
(六)信号量题目做题一般方法:
1.分析问题,找出同步、互斥关系
2.根据资源设置信号量变量
3.写出代码过程,并注意P、V操作的位置
4.检查代码,模拟机器运行,体验信号量的变化和程序运行过程是否正确。