生产者消费者模型

PV操作

在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

  • P操作:

    • 将信号量S的值减1,即S=S-1;
    • 如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
  • V操作:

  • 将信号量S的值加1,即S=S+1;

  • 如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。(若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。)

信号量的正负代表不同的含义

信号量的值与相应资源的使用情况有关。

  • 当它的值大于0时,表示当前可用资源的数量;
  • 当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

一、单生产者+单消费者+单缓冲

可以作以下比喻:将一个生产者比喻为一个生产厂家,如伊利牛奶厂家,而一个消费者,比喻是学生小明,而一个缓冲区则比喻成一间好又多。第一种情况,可以理解成伊利牛奶生产厂家生产一盒牛奶,把它放在好又多一分店进行销售,而小明则可以从那里买到这盒牛奶。只有当厂家把牛奶放在商店里面后,小明才可以从商店里买到牛奶。所以很明显这是最简单的同步问题。

解题如下:

定义两个同步信号量:

empty——表示缓冲区是否为空,初值为1。

full——表示缓冲区中是否为满,初值为0。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

产品送往Buffer;

V(full);

}

消费者进程

while(TRUE){

P(full);

从Buffer取出一个产品;

V(empty);

消费该产品;

二、单生产者+单消费者+多缓冲

一个生产者,一个消费者,公用n个环形缓冲区。

第二种情况可以理解为伊利牛奶生产厂家可以生产好多牛奶,并将它们放在多个好又多分店进行销售,而小明可以从任一间好又多分店中购买到牛奶。同样,只有当厂家把牛奶放在某一分店里,小明才可以从这间分店中买到牛奶。不同于第一种情况的是,第二种情况有N个分店(即N个缓冲区形成一个环形缓冲区),所以要利用指针,要求厂家必须按一定的顺序将商品依次放到每一个分店中。缓冲区的指向则通过模运算得到。

解题如下:

定义两个同步信号量:

empty——表示缓冲区是否为空,初值为n。

full——表示缓冲区中是否为满,初值为0。

设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

产品送往buffer(in);

in=(in+1)mod n;

V(full);

}

消费者进程

while(TRUE){

P(full);

从buffer(out)中取出产品;

out=(out+1)mod n;

V(empty);

消费该产品;

}

三、多生产者+多消费者+多缓冲

第三种情况,可以理解成有多间牛奶生产厂家,如蒙牛,达能,光明等,消费者也不只小明一人,有许许多多消费者。不同的牛奶生产厂家生产的商品可以放在不同的好又多分店中销售,而不同的消费者可以去不同的分店中购买。当某一分店已放满某个厂家的商品时,下一个厂家只能把商品放在下一间分店。所以在这种情况中,生产者与消费者存在同步关系,而且各个生产者之间、各个消费者之间存在互斥关系,他们必须互斥地访问缓冲区。

解题如下:

定义四个信号量:

empty——表示缓冲区是否为空,初值为n。

full——表示缓冲区中是否为满,初值为0。

mutex1——生产者之间的互斥信号量,初值为1。

mutex2——消费者之间的互斥信号量,初值为1。

设缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(TRUE){

生产一个产品;

P(empty);

P(mutex1);

产品送往buffer(in);

in=(in+1)mod n;

V(mutex1);

V(full);

}

消费者进程

while(TRUE){

P(full);

P(mutex2);

从buffer(out)中取出产品;

out=(out+1)mod n;

V(mutex2);

V(empty);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值