生产者与消费者问题

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

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操作


你可能感兴趣的:(消费者,生产者,资源)