热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

进程同步问题——生产者—消费者问题

进程同步问题——生产者—消费者问题问题梗概生产者—消费者问题是相互合作关系的进程关系的一种抽象,是一个广义的概念,可以代表一类具有相同属性的进程生
进程同步问题——生产者—消费者问题

问题梗概

生产者—消费者问题是相互合作关系的进程关系的一种抽象,是一个广义的概念,可以代表一类具有相同属性的进程

  1. 生产者:一个或者是多个生产者将生产的数据存入缓冲区中,通过in指针操作。
  2. 消费者:从缓冲数据中取出数据,通过out指针取出。
  3. 缓冲区:被消费者和生产者共享,循环使用,大小为n(存储单元的格数)
    图示:
    在这里插入图片描述
    1. 初始化缓冲区,in和out指针指向缓冲区的同一存储单元
    2. 写入数据,out指针后移,指针之前的单元格为满
    3. 取出数据,in指针后移,指针之前的单元格为空

访问特征


互斥访问缓冲区——单一访问

生产者和消费者必须一访问临界资源的互斥方式,访问缓存单元。在某一时间,仅仅允许一个单一的对象进缓存区访问。生产者放,消费者等待;消费者取,生产者等待;

同步访问缓冲区——配合访问

生产者和消费者必须相互沟通。即生产者不可以想满的数据里面写入数据,消费者不可以从空的缓冲区中取出数据。

  • 生产者进入缓冲区,申请空的存储单元,没有则阻塞
  • 消费者进入缓冲区,申请满的存储单元,没有则阻塞

访问方式总结

  • 在互斥访问的基础上,外包一个同步访问。
  • 互斥信号量,外套资源信号量。
  • 唯一访问的方式,外包一个配合访问的方式。

问题模拟

在这里插入图片描述

生产者的阻塞与唤醒


  1. 生产一件商品,检查缓冲区的个数,如果已满,进入阻塞
  2. 否则将商品放入到缓冲区,每放入一件计数器加1,然后判断计数器的个数,决定是否需要唤醒消费者

  • 如果等于1,说明在此之前缓冲区商品是0,消费者见到零为空就去阻塞,发出唤醒信号
  • 不等于1,说明等待区中还有消费者
  • 图例

在这里插入图片描述

消费者的阻塞与唤醒


  1. 先检查当前缓冲区的个数,如果为空,去阻塞
  2. 否则,进入缓冲区,取走一件商品,将商品计数器减一,然后判断计数器的个数,决定是否需要唤醒生产者

  • 如果等于N - 1(N是缓冲区的容量),说明再去走之前是满的,即之前的生产者会陷入阻塞,需要叫醒
  • 如果不等于,则无需叫醒生产者。
  • 图例

在这里插入图片描述

总的流程模拟

情景说明,绿色的是资源所,对应绿色的符号为资源锁的钥匙,黄色的位互斥锁,唤醒两个进程中所有的在互斥锁前等待的对象,随机进入缓存区。

  1. 初始化,缓存区为空,所有钥匙都在生产者进程上,五个生产者,仅仅四把钥匙,一个在资源锁门口陷入阻塞。
    在这里插入图片描述

  2. 然后生产者开始带着钥匙开始写入数据,out指针后移一位,满存储单元数加一,空存储单元数减一
    在这里插入图片描述

  3. 生产者2推出缓存区,将将钥匙给所有互斥锁前面的阻塞进程(随机分的),消费者对应的互斥锁前面没有任何进程,最终只能是生产者3,进入缓存区,继续写入out指针后移。
    在这里插入图片描述

  4. 生产者2将钥匙给消费者,消费者得到资源锁钥匙,来到互斥锁面前,并且陷入阻塞。
    在这里插入图片描述

  5. 生产者3,将钥匙送到消费者待机区,生产者5随机进入缓存区,写入数据out指针后移,后将钥匙送到消费者对应的资源锁前面。
    在这里插入图片描述

  6. 生产者4,又随机被唤醒,解开互斥锁,进入缓存区写入数据,out指针后移,将资源锁钥匙运到消费者资源锁前面。
    在这里插入图片描述

  7. 在所有存储单元都满了的情况下,空存储单元数目为0,满存储单元数为4,消费者被唤醒,进入缓存区,拿走数据,in指针后移。
    在这里插入图片描述

  8. 消费者和生产者双方都有了资源锁的钥匙,然后就开始随机进行选择,进入互斥锁的选择,为正常情况。
    在这里插入图片描述

在这里插入图片描述

总结

  1. 资源锁的钥匙的数目就是缓存区存储单元的个数。
  2. 生产者少了一把钥匙,就意味着填满了一个存储单元,消费者就多了一把钥匙。
  3. 消费者少了一把钥匙,就意味着清空了一个数据单元,生产者就多了一把钥匙。
  4. 通过上述的模拟,不难看出仅仅只要对信号量机制的程序模板进行简单的修改就可以重复运用,不需要设置特殊的情况。

伪代码实现


  1. 采用信号量机制的模板,修改S.value的表示方法在这里插入图片描述

总结


  1. 互斥信号量的P,V操作在每一个程序中必须成对出现
  2. 资源信号量(full,empty)也必须成对出现,但是可以处于不同的进程中
  3. 多个P的顺序不能够颠倒
  4. 上述问题是一个同步问题

  • 消费者取商品,有界缓冲区至少有一个单元是满的
  • 生产者放商品,有界缓冲区至少有一个是空的

  1. 有界缓冲区是临界资源,因此,生产者进程和消费者进程必须是互斥执行

推荐阅读
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • ThinkPHP框架中处理JS和CSS缓存问题的解决方案
    本文探讨了在ThinkPHP框架中,当启用调试模式(APP_DEBUG)时,删除public文件夹中的CSS和JS文件后页面仍然显示旧样式的问题,并提供了一种有效的解决方法。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • GIMP 2.99.2 发布:UI 采用 GTK3 实现、原生支持高分屏和 Wayland
    开源项目评选最后一周,手里的5票再不用就没用了https:www.oschina.netprojecttop_cn_2020GIMP2.99.2已发布,同时这也标志着GIMP3.0的到来,其中最显著的变化是从GTK2过渡到GTK3工具包。基于 ... [详细]
  • 本文深入探讨了 Redis 的两种持久化方式——RDB 快照和 AOF 日志。详细介绍了它们的工作原理、配置方法以及各自的优缺点,帮助读者根据具体需求选择合适的持久化方案。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文探讨了 Swapper 工具对系统内存和存储设备(如 SD 卡)的潜在影响,解释其工作原理及使用时需要注意的问题。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
author-avatar
晓晓鱼美人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有