首页 > 其他 > 详细

生产者与消费者问题

时间:2014-03-20 21:01:29      阅读:565      评论:0      收藏:0      [点我收藏+]

   生产者与消费者问题是进程管理中的问题

1、信号量与PV操作    

信号量:解决多个进程来竞争的资源的同步与互斥的问题,

         每个信号量需要有特定的意义,需要有初值。

PV操作:它是两条原语

     信号量的初值只能通过PV操作来改变

PV操作

P操作
V操作

s=s-1

s>=0表示进程要继续

s<0 资源受限,进程阻塞,并将其插入信号量等待队列中


s=s+1

若s>0进程继续执行

s<=0信号量需要从等待的队列中唤醒第一个进程,使其变为就绪状态,然后再返回原进程继续执行。

信号量

互斥模型
同步模型

进程P1                                      

Ps)s=s-1 s>=0          

CS1 进入临界资源区        

V(s)

进程P2

P(s)

CS2

V(s)

进程P1    

L1:P(s)  

进程P2

L2:V(s)

P1进程中S=0,则执行P2,此时s=s-1=-1<0则进程P2被阻塞

一直等待P1进程被释放,P2此时才可以进入临界区






2、生产者与消费者问题

生产者p1p2p3….pm

消费者:C1C2C3Cm

缓冲区为n


只要缓冲区未满,生产者便可放入

只要缓冲区有产品,消费者便可取


需要设置两个同步信号量

Empty=n

Full=0

刚开始空的单元为n,满的单元为0

生产者每放一个产品,empty=empty+1,full=full-1

消费者每取一个产品,empty=empty-1,full=full+!;


生产者与消费者不可同时进入缓冲区,则需要一个互斥信号量

Mutex=1;


代码如下所示:

int full=0;

int empty=n;

int mutex=1;

produceri ();

consumerj ();


生产者(producerI)消费者(consumerJ)

While(生产未完成){

生产一个产品;

P(empty);

P(mutex);

送产品到缓冲区中;

V(mutex);

V(full)

}

While(还要继续消费){

P(full);

P(mutex);

从缓冲区中取一个产品;

V(mutex);

V(empty);

消费一个产品;

}

总结此次学习的精髓:

互斥模型:是在同一个进程中实现PV操作的

同步模型:是在不同的进程中实现PV操作的

如上述问题中对于mutex的pV操作是在一个进程中同时存在的;而对于同步信号量empty、full是在不同的进程中完成的PV操作


本文出自 “不积跬步,无以至千里” 博客,请务必保留此出处http://jinhuiqin.blog.51cto.com/8596463/1379945

生产者与消费者问题,布布扣,bubuko.com

生产者与消费者问题

原文:http://jinhuiqin.blog.51cto.com/8596463/1379945

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!