解决进程同步与互斥问题的机制。
一种特殊变量,表现形式是一个整数Semaphore和一个队列。
S>=0时,S表示可用资源的数量。
S<0时,已经没有可用资源,S的绝对值表示当前等待该资源的进程数。
S=S-1
使用资源,此时如果S<0,则挂起该进程。
S=S+1
释放资源,此时如果S<0,从阻塞队列里唤醒一个进程。
互斥控制为了保护共享资源,不让多个进程同时访问该资源。
这种一次只让一个进程访问的资源称为临界资源,信号量初值设为1。
在互斥关系中,PV操作在一个进程中成对出现。
P(S) |
临界区 |
V(S) |
最简单同步形式是A在B到达L2之前不能超过L1。
设置信号量S初值为0,A到达L1后执行P操作后挂起,直到B到达L2后执行V操作将A唤醒。
在同步操作中,PV操作在两个甚至多个进程中成对出现。
进程A |
进程B |
L1 P(S) |
L2 V(S) |
也称有限缓冲问题。生产者生成数据项放到缓冲区(Bound为N)中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。
要解决该问题,就必须让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。
信号量 |
初值 |
描述 |
Empty |
N |
缓冲区空项数 |
Full |
0 |
缓冲区非空项数 |
Mutex |
1 |
互斥 |
生产者 |
消费者 |
P(Empty) |
P(Full) |
P(Mutex) |
P(Mutex) |
缓冲区加数据项 |
缓冲区加数据项 |
V(Mutex) |
V(Mutex) |
V(Full) |
V(Empty) |
参考资料:
原文:http://www.cnblogs.com/ad2012/p/3663943.html