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操作也是原子的。

  • 相关阅读:
    阿里巴巴FastJSON使用实例
    JSON知识点
    java序列化和反序列化
    JAVA里的VO、BO、PO分别指什么?
    Oracle基础语句练习记录
    maven命令
    maven官方教程
    linux下开启、关闭、重启mysql服务
    linux常用命令记录
    动态网页项目无法启动
  • 原文地址:https://www.cnblogs.com/lca1826/p/6589296.html
Copyright © 2011-2022 走看看