信号量简单的来说就是一个变量,代表着系统中互斥资源的数量,通常用原语来实现对信号量机制的操作。
一对原语:wait(S)也称为P操作,singnal(S)也称为V操作。S表示信号量
对于wait原语本身的内部逻辑代码如下(这里以一个一个互斥资源为例子)
整型信号量
int S=1;//信号量变量,表示临界资源的数量
void wait(S){//相当于进入区
if(s<=0);//如果此时没有空闲临界资源则一直循环等待
S=S-1;//如果资源够用占用一个资源
}
void signal(S){//相当于退出区
S=S+1;//使用完资源后释放一个资源
}
存在问题:不满足让权等待的原则
记录型信号量
/*记录型结构定义*/
typedef struct{
int value;//资源数量
struct process *L;//等待队列
}semaphore;
void wait(sempahore){
S.value--;
if(S.value<0)
block(S.L);//如果此时剩余资源不足则进入阻塞状态
}
void signal(sempahore){
S.value++;
if(S.vslue<=0)
weakup(S.L)//如果还有资源在等待则唤醒等待资源的进程
}