同步和P-V操作:P-V操作的概念
信号灯的概念
信号灯是一种卓有成效的进程同步机制。
1965年荷兰学者Dijkstra(迪科斯彻)提出
信号灯用于进程同步的基本思想
进程在运行过程受信号灯状态控制,并能改变信号灯状态
- 进程受控制:信号灯的状态可以阻塞或唤醒进程。
- 改变信号灯:信号灯的状态可以被进程改变。
信号灯机制
信号灯数据结构
- 信号灯变量定义为一个二元矢量(S,q)。
- S:整数,初值非负。
- q:PCB队列,初值为空集。
struct SEMAPHORE
{
int s; //整数,初值为负
Pointer_PCB;//队列:进程PCB指针,初值空集
}
信号灯操作
两个操作
- P操作(函数或过程,P(S,q))
- V操作 (函数或过程,V(S,q))
P,V是荷兰语:Passeren通过,Vrijgeren释放
P操作的原理(P(S,q),P(S))
- S值减一;
- 若差大于或等于零,该进程继续;
- 若差小于零,则该进程阻塞并加入到对列q中,并转调度函数
P(S,q)
{
S=S-1;
if(S<0)
{
Insert(Caller,q);
Block(Caller);
转调度函数();
}
}
提示:P操作可能使进程调用处阻塞。
提示2:S初值很重要!
V操作的原理
- S值加一
- 若和大于零,该进程继续;
- 若和小于或等于零,该进程继续同时从q中唤醒一个进程。
V(s,q)
{
S=S+1;
if(S<=0)
{
Remove(q,pid);//pid进程ID
Wakeup(pid);
}
}
提示:V操作可能会唤醒阻塞的进程