[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操作也是原子的。

posted @ 2017-03-20 15:33  Strawberry丶  阅读(1816)  评论(0编辑  收藏  举报