信号量可以用来解决互斥与同步问题,它只能被两个标准的原语,wait(S) 和 signal(S) 来访问,也可以记为“P操作”和“V操作”。
P/V操作:
wait(S){
while(S<=0);
S = S - 1;
}
signal(S){
S = S + 1;
}
- s>=0可以表示可用资源数
- s<0时,绝对值表示等待资源的进程个数
互斥信号量的作用:在两次PV操作之间,不允许其他进程使用资源。(类似于锁)
读者-写者问题的理解:
Reader i
begin
p(rmutex); //开始对READCOUNT操作,加锁
if readcount = 0 then p(wmutex); //如果没有其他读进程,不允许写进程,写加锁
readcount:= readcount + 1;
V(rmutex);//对READCOUNT操作,关锁
perform read operations;
p(rmutex);//开始对READCOUNT操作,加锁
readcount:= readcount - 1;
if readcount = 0 then V(wmutex);//如果没有其他读进程,不允许写进程,写关锁
V(rmutex);//对READCOUNT操作,关锁
end
Writer j
begin
p(wmutex);
perform write operations;
V(wmutex);
end