格式 | wait()/P操作 | signal()/V操作 | ||
---|---|---|---|---|
整型 | int S = 1; | while(s<=0); S=S-1; | S=S+1; | 可能会忙等 |
记录型 | type struct{ int value; struct process *L; } S | S.value--; if(S.value<0) //将进程挂到信号量的等待队列中 //并使用block原语进行自我阻塞 //主动放弃处理机 block(S.L); | S.valus++; if(S.value <=0) //如果释放资源之后信号量小于等于0 //即还存在进程等待该资源,则通过wakeup唤醒 wakeup(S.L); | 不会忙等 会主动放弃处理机使用权 |
一个信号量其实代表一种资源,其值代表资源剩余量
P操作:请求资源,请求不到则阻塞
V操作:释放资源,若存在等待该资源的进程则唤醒
使用信号量实现进程互斥
记录性型号量 mutex = 1;
p1(){
P(mutex);
//临界区代码
V(mutex);
}
P2(){
P(mutex);
//临界区代码
V(mutex);
}
注意!!! 不同资源要设置不同的信号量来表示
P、V操作必须成对表示
使用信号量机制实现进程同步
设置信号量初始值为0
记录型信号量 S = 0;
P1(){
代码1;
代码2;
V(S);
代码3;
}
P2(){
P(S);
代码4;
代码5;
}
用来确保代码4的执行要在代码2之后
在每个“前操作”后执行V操作,告诉另一个进程可以继续执行了
在每个“后操作”前执行P操作,用于等待另一个进程执行到该执行的操作之后