zoukankan      html  css  js  c++  java
  • 生产者消费者问题

    生产者消费者问题

    问题描述

    系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。

    生产者、消费者共享一个初始为空、大小为n的缓冲区。

    只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

    只有缓冲区不空时,消费者才能从重取出产品。否则必须等待。

    Snipaste_2020-11-04_15-07-30

    问题分析

    Snipaste_2020-11-04_15-10-28

    如何实现

    Snipaste_2020-11-04_15-11-26

    思考:能否改变相邻P、V操作的顺序

    Snipaste_2020-11-04_15-12-19

    Snipaste_2020-11-04_14-59-45

    多生产者、多消费者

    问题描述

    Snipaste_2020-11-04_16-26-57

    问题分析

    1. 关系分析。找出题目中的各个进程,分析它们之间的同步、互斥
    2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
    3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值

    互斥关系:(mutex=1)

    ​ 对缓冲区(盘子)的访问要互斥地进行

    同步关系:(一前一后)

    1. 父亲将苹果放入盘子,女儿才能取苹果
    2. 母亲将橘子放入盘子后,儿子才能取橘子
    3. 只有盘子为空时,父亲或母亲才能放入水果

    “盘子为空”这个事件可以由儿子或女儿触发,事件发生后才允许父亲或母亲放水果

    如何实现

    Snipaste_2020-11-04_15-25-04

    问题:可不可以用互斥信号量?

    Snipaste_2020-11-04_15-26-47

    结论:

    ​ 即使不设置专门互斥变量mutex,也不会出现多个进程同时访问盘子的现象。

    原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区..

    知识回顾与重要考点

    解决“多生产者——多消费者问题”的关键在于理清复杂的同步关系

    在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把“一前一后”发生的事看做是两种“事件”的前后关系

    比如,如果从单个进程行为的角度来考虑的话,我们会有以下结论:

    ​ 如果盘子里装有苹果,那么一定要女儿取走苹果后父亲或母亲才能再放入水果

    ​ 如果盘子里装有橘子,那么一定要儿子取走橘子后父亲或母亲才能再放入水果

    ​ 这么看是否就意味着要设置四个同步信号量分别实现这四个“一前一后”的关系了?

    正确的分析方法就应该从“事件“的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”

    盘子变空事件->放入水果事件。“盘子变空事件”既可以由儿子引发,也可由女儿引发;“放入水果事件”既可以是父亲执行,也不可以是母亲执行。这样的话,就可以用一个同步信号量解决问题了。

    Snipaste_2020-11-04_16-42-05

  • 相关阅读:
    C#与面向对象编程语言
    Windows Communication Fundation(WCF)的安装和一些疑惑
    Windows Communication Foundation入门(Part Two)
    Design & Pattern团队公告
    解决方案、项目、程序集、命名空间
    你注意到了吗?
    我的个人主页
    PetShop与设计
    CKEditor/CKFinder升级心得
    [转贴]基于UDP、TCP协议的C#网络编程之一
  • 原文地址:https://www.cnblogs.com/coderD/p/13926834.html
Copyright © 2011-2022 走看看