[OS] 生产者-消费者问题(有限缓冲问题)
·最简单的情形--(一个生产者 + 一个消费者 + 一个大小为1的有限缓冲)
首先来分析其中的同步关系:
·必须在生产者放入一个产品之后,消费者才能够从缓冲中取出产品来消费。
·只有在消费者从缓冲区中取出产品(消费)之后,生产者才能再放新的产品进缓冲区。
下面我们用P(Producer)来表示生产者进程,用C(Consumer)来表示消费者进程,则下面是他们所要进行的操作的伪码表示:
P: while(true){ //生产一个产品; //送产品到缓冲区; };
C: while(true){ //从缓冲区取产品 //消费产品 };
能不能往缓冲区放东西,取决于缓冲区的状态:
·空--只能放,不能取
·满--只能取,不能放
因为缓冲区大小为1,所以我们设立两个信号量empty = 1,full = 0
下面是改进后的代码:
P: while(true){ //生产一个产品; P(empty); //送产品到缓冲区; V(full); };
C: while(true){ P(full); //从缓冲区取产品 V(empty); //消费产品 };
·生产者--消费者问题的推广(n个缓冲区 + m个生产者 + k个消费者)
也就是下图所示的场景:
下面是改进后的代码:
P: while(true) { //生产产品; P(empty); P(mutex1); //往Buffer [i]放产品; i = (i+1) % n; V(mutex1); V(full); }; //i的初值为0
C: while(true) { P(full); P(mutex2); //从Buffer[j]取产品; j = (j+1) % n; V(mutex2); V(empty); //消费产品; }; //j的初值为0
注:
·生产者和消费者之间不需要互斥,所以mutex不能一样
·生产者生产产品与i的加1操作是原子的;消费者消费产品与j的加1操作也是原子的。