经典的生产者─消费者问题
同步问题:
互斥访问缓冲池
不能往“满”的缓冲区中放产品
不能从“空”的缓冲区中取产品
生产者-消费者问题
生产者-消费者(Producer-Consumer)问题是著名的进程同步问题。它描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。以下用信号量解决生产者-消费者问题。
假设缓冲池中有n个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量mutex使诸进程对 缓冲池实现互斥访问;利用empty和full计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将 消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。
生产者-消费者问题(续)
其中,mutex,empty,full的初始值分别为1,n,0;
P.V操作讨论
1) 信号量的物理含义:
S>0表示有S个资源可用
S=0表示无资源可用
S<0则| S |表示S等待队列中的进程个数
P(S):表示申请一个资源
V(S)表示释放一个资源。信号量的初值应该大于等于0
2) P.V操作必须成对出现,有一个P操作就一定有一个V操作
当为互斥操作时,它们同处于同一进程
当为同步操作时,则不在同一进程中出现
如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前而两个V操作无关紧要
P.V操作的优缺点
P.V操作优点:
简单,而且表达能力强(用P.V操作可解决任何同步互斥问题)
缺点:
不够安全;
P.V操作使用不当会出现死锁;
遇到复杂同步互斥问题时实现复杂