热门标签 | 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. 有界缓冲区是临界资源,因此,生产者进程和消费者进程必须是互斥执行

推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 达人评测 酷睿i5 12450h和锐龙r7 5800h选哪个好 i512450h和r75800h对比
    本文介绍了达人评测酷睿i5 12450h和锐龙r7 5800h选哪个好的相关知识,包括两者的基本配置和重要考虑点。希望对你在选择时提供一定的参考价值。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了关于smarty自定义缓存名的解决思路,通过放弃生成缓存,直接生成html的静态页面来提高速度。同时提供了一个参考链接供参考。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
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社区 版权所有