• OS2.3.7:多生产者,多消费者问题


    0 问题描述

    桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
    在这里插入图片描述
    其中多生产者,多消费者,其中的“多”,并不是指多个,而是指多类

    1 问题分析

    桌子上有一只盘子每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。(盘子当做缓冲区)

    1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系(对缓冲区的访问要互斥的进行)。
    2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。

    互斥:在临界区前后分别PV。
    同步:前V后P。

    在这里插入图片描述

    2 实现

    在这里插入图片描述
    取出的时候,要检查缓冲区是否有自己要取的东西。

    当去掉互斥信号量mutex后,分析:刚开始,儿子、女儿进程即使上处理机运行也会被阻塞。如果刚开始是父亲进程先上处理机运行,则:父亲P(plate),可以访问盘子→母亲P(plate),阻塞等待盘子→父亲放入苹果V(apple),女儿进程被唤醒,其他进程即使运行也都会阻塞,暂时不可能访问临界资源(盘子)→女儿P(apple),访问盘子,V(plate),等待盘子的母亲进程被唤醒→母亲进程访问盘子(其他进程暂时都无法进入临界区)→…

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

    父亲P(plate),可以访问盘子→母亲P(plate),可以访问盘子→父亲在往盘子里放苹果,同时母亲也可以往盘子里放橘子。于是就出现了两个进程同时访问缓冲区的情况,有可能导致两个进程写入缓冲区的数据相互覆盖的情况。因此,如果缓冲区大小大于1,就必须专门设置一个互斥信号量mutex来保证互斥访问缓冲区。

    3 总结

    在这里插入图片描述

    PV操作题目的解题思路:

    1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
    2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
    3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
      在这里插入图片描述
  • 相关阅读:
    【Java 基础篇】Java TreeSet 详解:红黑树实现的有序集合
    Java中为什么wait和notify方法要在同步块中调用
    Spring mvc中Controller如何设置接受参数的默认值呢?
    深入理解WPF中的依赖注入和控制反转
    蓝桥杯每日一题2023.10.1
    HDLBits: 在线学习 SystemVerilog(六)-Problem 24-27
    十三、队列的特性
    第4章 SpringBoot与Web应用
    搭建TiDB双集群主从复制
    封仲淹:OceanBase社区版4.0未来畅想
  • 原文地址:https://blog.csdn.net/weixin_44673253/article/details/126322646