在操作系统中,进程之间经常会存在互斥(共享独占性资源)和同步(完成异步的两个进程的协作)两种关系。
为了有效处理这两种情况,专家在1965年提出信号量和PV操作。
1.信号量:一种特殊的变量,表现形式是一个整型S和一个队列。
2.P操作:S=S-1,若S<0,进程暂停执行,进入等待队列。
3.V操作:S=S+1,若S<=0,唤醒等待队列中的一个进程。
一、互斥控制
进程互斥是资源的竞争关系。互斥是为了保证临界资源在某一时刻只被一个进程访问。
信号量一般是S=1
P(S)——临界区——V(S)
---P操作
P(pem){
sem = sem -1;
if (sem < 0) 进程进入等待状态
else 继续进行;
}
二、同步控制
同步是进程间的协作关系。同步是异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程。
信号量一般是S=0
A进程,P(S) 然后B进程运行,V(S),然后A进程才能接下去运行。
---V 操作
V(sem){
sem = sem +1;
if (sem <= 0) 唤醒队列中的一个等待进程;
else 继续进行;
}
三、生产者-消费者问题
这是一个经典的问题,它不仅要解决生产者、消费者的同步关系,还需要处理缓冲区的互斥关系。
empty——同步,说明空闲缓冲区的数量,S=N
full——同步,说明已经填充的缓冲区的数据,S=0
mutex——互斥,保证只有一个进程在写缓冲区,S=1
PS:
信号量S的初值通常就是表示资源的可用数。S=0,一般会先做V操作。
在使用资源前,先做P(S)操作,确保有资源可用用;
资源使用完毕,会做V(S)操作,释放资源。
在互斥关系中,P V操作是在一个进程中成对出现;
在同步关系中,P V操作一定是在两个进程甚至是多个进程中成对出现的。