问题背景:有两个进程分别为消费者进程和生产者进程,对同一个临界资源进行访问,生产者不断地将生产的产品加入缓存区,而消费者不断地消费缓存区中的资源,利用信号量实现两个进程的同步和互斥。
问题分析:在生产者往缓存区中加入产品的时候,需要两个信号量,一个是互斥信号量,使得在生产者往缓存里放产品的时候其他进程不能对临界资源进行操作,另一个信号量是指示缓存区是否已满的信号量,从而判断生产者能否往缓存区加入产品;而消费者从缓存区中消费资源的时候,也需要两个信号量,一个信号量是互斥信号量,使得消费者在从缓存区中取产品的时候其他进程不能对临界资源进行操作,另外一个信号量是指示缓存区是否空,从而判断消费者能否对缓存区进行操作。
由以上分析,可知在该问题*需要三个信号量,一个是用于互斥的信号量mutux=1;一个是用于指示缓存区空位置数目的empty=N;另外一个是指示缓存区填满位置的信号量full=0;
从而,可以该问题可以有以下解决办法:
那么,从上面可以看出,用于同步的信号量一定是位于不同进程中,用于互斥的信号量一定是位于同一个进程中。
下面我们来分析一个例题,如下:
在这个例题中,水桶只有三个,井和缸只能容纳一个桶进出,并且缸只能容纳十桶水:
所以 1.对井的操作需要加互斥关系
2.对缸的操作需要加互斥关系
3.记录桶数目的信号量
4.指示缸满和缸空的信号量
因此,我们设定以下信号量:mutux1=1; mutux2=0; empty=10; full=0; count=3;
那么,这个问题可以通过以下算法解决: