系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
生产者和消费者是共享一个初始为空、大小为n的缓冲区的。

刚开始缓冲区是空的,所以生产者可以往缓冲区中放入产品。

当缓冲区放满了之后,生产者就不能往里放数据了,此时只能让消费者取走产品,生产者才能继续将产品放入。
缓冲区是临界资源,各进程必须互斥地访问。
假如系统当中有两个生产者进程,两个生产者进程发现缓冲区当中的位置都是空的,由于并发性,两个生产者进程很有可能都瞄准了同一个缓冲区当中的块。所以由于这个特性,所以缓冲区必须是被互斥的进行访问的。

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
生产者、消费者共享一个初始为空、大小为的缓冲区。
Q:如何使用信号量机制(P,V操作)实现生产者、消费者进程的这些功能呢?
A:信号量机制可以实现互斥、同步、对一类系统资源的申请和释放。
关于互斥的实现:
关于同步的实现:
关于对同一类系统资源的申请和释放
所以,上一节的问题,都可以归类于互斥、同步的问题。
PV操作题目分析步骤:
生产者每次要消耗§一个空闲缓冲区,并生产(V)一个产品。消费者每次要消杌§一个产品,并释放一个空闲缓冲区(V)往缓冲区放入/取走产品需要互斥。

生产者将产品放入缓冲区,消费者从缓冲区取走产品。

实现互斥是在同一进程中进行一对PV操作;实现两进程的同步
关系,是在其中一个进程中执行P,另进程中执行V。

若此时缓冲区内己经放满产品,则empty=0,full=n。
则生产者进程执行①使mutex? 变为0,再执行②,由于己没有空闲缓冲区,因此生产者被阻塞。
由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于utex为0,即生产者还没
释放对临界资源的“锁”,因此消费者也被阻塞。
这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。同样的,若缓冲区中没有产品,即full=0,empty=n。按③④①的顺序执行就会发生死锁。因此,实现互斥的P操作一定要在实现同步的P操作之后。V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
综上,实现互斥的P操作要放到实现同步的P操作之后。V操作可以交换,不会导致阻塞。
