生产者-消费者问题

前言

也叫缓存绑定问题(bounded- buffer),是一个经典的、多进程同步问题。


生产者、消费者问题

1. 问题描述

​ 有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上。其中,生产者进程Producer_i和消费者进程Consumer_j都是并发进程,只要缓冲区未满,生产者Producer_i生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程Consumer_j就可从缓冲区取走并消耗产品。

2. 可能情形
  • n=1, m=1, k=1
  • n=1, m=1, k>1
  • n>1, m>1, k>1
3. 问题分析

​ 生产者和消费者是同步关系,生产者先生产,消费者才能消费,一般这种情况会设置2个同步信号量,而它们之间对缓冲区的使用是互斥关系,同一时刻,仅能有一个进程能对缓冲区进行操作,所以还需要设置一个互斥信号量(仅对多生产者、多消费者情形而已)。

4. 单生产者、单消费者、单缓冲区

P、V操作如下

int B; // 缓冲区
semaphore empty = 1; // 可以使用的空缓冲区数
semaphore full = 0;  // 缓冲区内可以使用的产品数

cobegin
process producer() { // 生产者
    while(true) {
        produce();
        P(empty);
        append() to B;
        V(full);
    }
}

process consumer() { // 消费者
    while(true) {
        P(full);
        take() from B;
        V(empty);
        consume();
    }
}
coend

PS:同步信号量的P、V操作是散在不同进程里的

5. 单生产者、单消费者、多缓冲区
int B[k]; // K个缓冲区
semaphore empty = k; // 可以使用的空缓冲区数
semaphore full = 0;  // 缓冲区可使用的产品数
int in = 0; // 放入缓冲区的指针
int out = 0; // 取出缓冲区的指针

cobegin
process producer() { // 生产者
    while(true) {
        produce();
        P(empty);
        append() to B[in];
        in = (in+1) % k;
        V(full);
    }
}

process consumer() { // 消费者
    while(true) {
        P(full);
        take() from B[out];
        out = (out+1) % k;
        V(empty);
        consume();
    }
}
coend
6. 多生产者、多消费者、多缓冲区
int B[k]; // k个缓冲区
semaphore empty = k; // 可以使用的空缓冲区数
semaphore full = 0;  // 缓冲区可使用的产品数
int in = 0; // 放入缓冲区的指针
int out = 0; // 取出缓冲区的指针
semaphore mutex = 1; // 互斥信号量,互斥使用in,out

cobegin
process producer_i() { // 生产者
    while(true) {
        produce();
        P(empty);
        P(mutex);  // 多个生产者使用in游标要互斥
     		append() to B[in];
     		in = (in+1) % k;
        V(mutex);
        V(full);
    }
}

process consumer_j() { // 消费者
    while(true) {
        P(full);
        P(mutex);  // 多个消费者使用out游标要互斥
        	take() from B[out];
        	out = (out+1) % k;
        V(mutex);
        V(empty);
        consume();
    }
}
coend

PS: 大体上同步,局部互斥
d=====( ̄▽ ̄*)b

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值