什么是信号量? 信号量是一个特殊的变量。
信号量的作用: 用于进程间传递信息的一个整数值。
信号量的定义:
struct semaphore {
intcount;
queueType queue;
}
这是一个结构体,由一个值和一个队列组成。值是传递的信息(一个整数),而队列是允许进程挂在队列上的。
信号量的声明:semaphore s
对信号量可以实施的操作:初始化、P和V(P、V分别是荷兰语的test(proberen)和increment(verhogen))。
信号量类似于现实中的信号灯。红灯停绿灯行。
P操作主要做2件事情:
1.给信号量值减1
2.判断值是否小于0,如果值小于0,那么调用P操作的进程的状态就变成阻塞状态,并且把进程送到相应的等待队列的末尾,cpu重新调度。
如果值不小于0,那么实施P操作的进程继续执行。
V操作:
1.给信号量值加1
2.判断值是否小于等于0,如果小于等于0,那么就唤醒信号量队列上等待的一个进程,将其状态改变为就绪状态,并插入就绪队列。
P即down,semWait。
V即up,semSignal。

PV概念图
吃苹果问题java示例代码
问题描述:桌上有一只盘子,最多可以容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘中放苹果(apple),妈妈专向盘中放橘子(orange),两个儿子专等吃盘中的橘子,两个女儿专等吃盘中的苹果。请用P、V操作或管程来实现爸爸、妈妈、儿子、女儿之间的同步和互斥关系。
import java.util.concurrent.Semaphore;
public class Plate {
private Semaphore apple = new Semaphore(0);
private Semaphore orange = new Semaphore(0);
private Semaphore mutex = new Semaphore(2);
public void dadPutApple() throws InterruptedException {
mutex.acquire();
apple.release();
mutex.release();
}
public void momPutOrange() throws InterruptedException {
mutex.acquire();
orange.release();
mutex.release();
}
public void sonEatOrange() throws InterruptedException {
orange.acquire();
mutex.acquire();
mutex.release();
}
public void daughterEatApple() throws InterruptedException {
apple.acquire();
mutex.acquire();
mutex.release();
}
}
软考例题
进程P1、P2、P3、P4和P5的前趋图如图所示:

前趋图
若用PV操作控制进程P1、P2、P3、P4 、P5并发执行的过程,则需要设置5个信号量S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于零。图2中a、b 和c处应分别填写 (1);d和e处应分别填写 (2),f和g处应分别填写 (3)

图2
(1)
A. V(S1)、P(S1)和V(S2)V(S3)
B. P(S1)、V (S1)和V(S2)V(S3)
C. V(S1)、V(S2)和P(S1)V(S3)
D. P(S1)、V(S2)和V(S1)V(S3)
(2)
A. V(S2)和P(S4)
B. P(S2)和V(S4)
C. P(S2)和P(S4)
D. V(S2)和V(S4)
(3)
A. P(S3)和V(S4)V(S5)
B. V(S3)和P(S4)P(S5)
C. P(S3)和P(S4)P(S5)
D. V(S3)和V(S4)V(S5)
解题过程
前趋图中节点之间连线根据左上到右下的顺序标注信号量(S1、S2、S3...),根据前驱图制作下表,再按照题目要求查表就行,进程顶部区域查前驱列,进程底部区域查后继列

表1
答案:A / B / C