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

  • 相关阅读:
    【JS】限制两个或多个单选框最多只能选择一个
    Markdown基本语法
    【thinkphp5】 分页样式修改
    Vscode 修改为中文语言
    【linux】Crontab 定时任务 使用实例
    【微信开发】 模板消息发送
    二维数组转化为字符串,中间用,隔开
    【golang】 go语言之环境搭建+ 第一个go语言程序
    【PHPstudy】安装Composer
    【LNMP】基于阿里云的https免费证书配置
  • 原文地址:https://www.cnblogs.com/coderD/p/13926834.html
Copyright © 2011-2022 走看看