进程互斥和进程同步的消费者问题

消费者问题涉及两个基本的实体,一个是生产者,一个是消费者
实体间的关系:生产者生产产品,消费者消费产品
问题描述:生产者生产产品,并且将产品保存到仓库之中,然后消费者从仓库中取出产品
基础知识:关于p操作和v操作
p操作(将信号量减一,如果信号量小于0,则不执行下面操作,若大于等于0则执行下面的操作)
v操作(将信号量加一,如果信号量小于等于0,则不执行下面操作,不唤醒进程,如果信号量大于0则执行操作唤醒进程)

实例1:一个生产者,一个消费者,一个存储位置问题

semapore s1=1,s2=0//s1,s2是两个信号量,其中s1表示仓库中是否有位置,s2表示仓库中是否有产品
course(a)//生产者进程
{
p(s1);//查看仓库中是否有位置,如果有,那么s1=s1-1=0,如果没有,s1=s1-1=-1,因为初始化为有,所以s1=0,则可以继续执行
存入产品buff;
v(s2);//存入完之后,表示产品的s1=s2+1=1,由于s2不为0,因此唤醒进程course(b)
}
course(b)//消费者进程
{
p(s2);//查看仓库中是否有产品,如果有,那么继续执行,同时s2=s2-1=-1
取出产品buff;
v(s1);//因为取完了,所以有了位置,所以s1=s1+1
}

实例2:一个生产者,多个消费者,一个存储空间,消费者B,C,D依次的取产品

semapore empty=1,s1=1,s2=0,s3=0,s4=0
course(a)//生产者进程
{
p(empty);
produce buff;
v(s4);
}
course(b)//消费者B进程
{
p(s1);
p(s4);
fetch buff;
v(s2);
v(empty);
}
course(c)//消费者C进程
{
p(s2);
p(s4);
fetch buff;
v(s3);
v(empty);
}
course(d)//消费者D进程
{
p(s3);
p(s4);
fetch buff;
v(s1);
v(empty);
}

实例3:多个生产者A,B,C,一个消费者,一个存储空间,由多个生产者轮流生产(类似于上述例子)
实例4:一个生产者,一个消费者,k个存储空间,先将存储空间存满,然后消费者每取一个就存入一个

semapore empty=k,s1=-k+1
course(a)
{
p(empty);
produce buff;
v(s1);
}
course(b)
{
p(s1);
fetch buff;
v(empty);
}

实例5:一个生产者,多个消费者A,B,C,k个存储空间,不断的生产至满了后轮流取出或者并发取出(类似于上面的例子)
实例6:多个生产者A,B,C,一个消费者,k个存储空间生产者并发或者轮流的存放商品知道仓库满,然后消费者在循环的将商品取出(类似于上面的例子,可以加上条件判断语句)

semapore s1=1,s2=0,s3=0,s4,count=0
course(a)
{
p(s1);
produce buff;
count++;
if(count<k)
{v(s2);}
if(count==k)
{v(s4);}
}
course(b)
{
p(s2);
produce buff;
if(count<k)
{v(s3);}
if(count==k)
{v(s4);}
}
course(c)
{
p(s3);
produce buff;
if(count<k)
{v(s1);}
if(count==k)
{v(s4);}
}
course(d)
{
p(s4);
fetch produce;
count--;
if(count==0)
{v(s1);}
if(count>0)
{v(s4);}
}

还有许多的例子,但是大同小异,道理都是如此

猜你喜欢

转载自blog.csdn.net/FZUMRWANG/article/details/79850768