信号量及PV操作
- 一个特殊变量
- 用于进程间传递信息的一个整数值
- 定义如下
struct semaphore
{
int count;
queueType queue;
}
- 信号量说明:semaphore s;
- 对信号量可以实施的操作:初始化、P和V
P、V操作定义
P(s)
{
s.count--;
if(s.counnt<0)
{
//该进程状态置为阻塞状态;
//将该进程插入相应的等待队列s.queue末尾
//重新调度
}
}
down
V(s)
{
s.count--;
if(s.counnt<=0)
{
//唤醒相应等待队列s.queue中等待的一个进程;
//改变其状态为就绪态,并将其插入就绪队列;
}
}
up
有关说明
- P、V操作为原语操作
- 在信号量上定义了三个操作
- 初始化(非负数)、P操作、V操作
- 最初提出的是二元信号量(解决互斥)
- 之后,推广到一般信号量(多值)或计数信号量(解决同步)
用PV操作解决进程间互斥问题
- 分析并发进程的关键活动,划定临界区
- 设置信号量mutex,初值为1
- 在临界区前实施P(mutex)
- 在临界区之后实施V(mutex)