一.信号量
- 信号量其实就是一个变量,可以用信号量来表示系统中某种资源的数量。
- 用户进程可以使用操作系统提供的一对原语来操作信号量
- 一对原语:wait(S)和signal(S)
可以理解为wait和signal是函数名,信号量S是传入的参数 - wait和signal通常又称为P、V操作
二.整型信号量
概念:用一个整数型变量作为信号量,数值表示某种资源数
与普通整型变量的区别:对信号量只能进行初始化、P、V三种操作
举例:
- 初始化S=1,表示当前系统只有只有一个打印机资源可用
- 执行P操作(wait原语):相当于进入区。当发现S<=0,则说明资源数不够,那么则一直循环等待。如果发现S>0,则说明资源足够,则执行S-1,说明该进程占用了一个资源。这个过程其实也就是检查和上锁。
- 执行V操作(signal原语):相当于退出区。就是使用完资源以后,在退出区执行S+1,就是释放资源。
存在的问题:不满足让权等待原则,会发生忙等
三.记录型信号量
为了解决整型信号量的会发生忙等的问题,提出了记录型信号量
1.记录型信号量的定义
- 记录型信号量中包含两部分,value表示剩余的资源数,L表示信号量S的等待队列(即就绪队列)。
2.P操作
- 当有进程要使用资源时,使用wait原语申请资源
- 先让资源数value-1,然后判断此时的value值是否小于0,如果>=0说明还有剩余资源,那么就给进程分配资源
- 如果value值小于0,则说明已经没有剩余资源了,因此就要执行原语block(S.L):使该进程从运行态进入就绪态,并挂入信号量S的等待队列中。
- 可见该机制遵循了让权等待原则,不会出现忙等现象
3.V操作
- 进程使用完资源后,通过signal原语释放资源
- 首先让value值加1,代表释放一个资源,然后判断value值是否<=0,如果大于0,则说明此时没有进程在S的等待队列中
- 如果value值<=0,则说明此时S的等待队列中有进程在等待该资源,那么就要执行原语wakeup(S.L):即从等待队列中唤醒一个进程,让其从就绪态变成运行态,