zoukankan      html  css  js  c++  java
  • [OS] 生产者-消费者问题(有限缓冲问题)

    ·最简单的情形--(一个生产者 + 一个消费者 + 一个大小为1的有限缓冲)

      首先来分析其中的同步关系:

    ·必须在生产者放入一个产品之后,消费者才能够从缓冲中取出产品来消费。
    ·只有在消费者从缓冲区中取出产品(消费)之后,生产者才能再放新的产品进缓冲区。

    下面我们用P(Producer)来表示生产者进程,用C(Consumer)来表示消费者进程,则下面是他们所要进行的操作的伪码表示:

    P:
    while(true){
    	//生产一个产品;
    	//送产品到缓冲区;
    };
    C:
    while(true){
    	//从缓冲区取产品
    	//消费产品       
    };
    

    能不能往缓冲区放东西,取决于缓冲区的状态:
    ·空--只能放,不能取
    ·满--只能取,不能放
    因为缓冲区大小为1,所以我们设立两个信号量empty = 1,full = 0

    下面是改进后的代码:

    P:
    while(true){
    	//生产一个产品;
        P(empty);
    	//送产品到缓冲区;
    	V(full);
    };
    C:
    while(true){
        P(full);
    	//从缓冲区取产品
    	V(empty);
    	//消费产品
    };
    

    ·生产者--消费者问题的推广(n个缓冲区 + m个生产者 + k个消费者)

    也就是下图所示的场景:

    下面是改进后的代码:

    P:
    while(true)
    {
        //生产产品;
        P(empty);
        P(mutex1);
        //往Buffer [i]放产品;
        i = (i+1) % n;
        V(mutex1);
        V(full);
    };
    
    //i的初值为0
    
    C:
    while(true)
    {
        P(full);
        P(mutex2);
        //从Buffer[j]取产品;
        j = (j+1) % n;
        V(mutex2);
        V(empty);
        //消费产品;
    };
    
    //j的初值为0
    

    注:

    ·生产者和消费者之间不需要互斥,所以mutex不能一样

    ·生产者生产产品与i的加1操作是原子的;消费者消费产品与j的加1操作也是原子的。

  • 相关阅读:
    程序猿之歌
    How to solve the problem : "You have been logged on with a temporary profile"
    LeetCode Jump Game
    hdu 3496 Watch The Movie
    matlab矩阵内存预分配
    【Windows socket+IP+UDP+TCP】网络基础
    <html>
    行为类模式(十):模板方法(Template Method)
    行为类模式(九):策略(Strategy)
    行为类模式(八):状态(State)
  • 原文地址:https://www.cnblogs.com/lca1826/p/6589296.html
Copyright © 2011-2022 走看看