生产者消费者

对于生产者消费者这个问题,我们可以用生活中一个简单的例子来说明:

桌子上有个盘子,一个人往盘子里面放苹果,一个人从盘子里面拿走苹果,放苹果的人相当于生产者,拿走苹果的人相当于消费者,而盘子就相当于一个生产场所。如果我们要保证拿苹果的人一直都有苹果拿,那就要让放苹果的人一直放,而且要比拿苹果的人快一点。当盘子满的时候放苹果的人就要等着拿苹果的人把苹果拿走,等盘子里有了位置,就可以继续放苹果。如果我们要求每次只能放一个苹果,拿苹果的人每次也只能拿一个苹果,而放苹果和拿苹果的人都不只是一个人,这样的话,放苹果的人和放苹果的人之间就会产生互斥关系,一个人放苹果的时候,其他人就不能放,拿苹果的人也是一样,一个人拿苹果的时候,其他人就不能拿。而拿苹果的人和放苹果的人也有互斥关系和同步关系,放苹果的人放了苹果之后,要通知拿苹果的人来拿苹果,否则盘子满了,放苹果的人就要等待。

好了,不说苹果了,我们来官方一点啦

生产者要做的就是生产数据,消费者要做的是读取数据并且要拿走。而且生产者和消费者是在一个环形缓冲区进行的,和我在管道那篇博客中写的一样

生产者消费者之间的关系

(1)消费者和消费者是互斥关系,因为一个消费者来读取数据的时候其他消费者是不能来读取数据的
(2)生产者和生产者是互斥关系,因为一个生产者在写入数据的时候其他生产者是不能写入数据的
(3)生产者和消费者是互斥关系,同步关系,当生产者生产了之后,会通知消费者来消费,否则当生产者生产满了的时候,就需要等待消费者来消费,等到满足生产的要求的时候再生产,这就对于临界资源的访问会产生一定的顺序,会提高系统内部资源的读取速度。
消费者指向的位置都是有有效数据的,生产者指向的位置都是没有有效数据的,和管道的环形缓冲区类似,把管道的环形缓冲区图拿过来凑合看看理解吧。 这幅图里面,你可以把write看作是生产者,在一直生产数据,read可以看作是消费者,一直在读取数据。 生产者所关心的资源是环形buf中空余的位置,即没有有效数据的位置, 消费者不关心格子,只关心数据
读者写者问题
读者写者都干什么呢?
   写者把数据扔到缓冲区中,读者只读数据,不会把数据拿走
读者写者的关系:
(1)读者和读者没有关系,因为数据不会被拿走,不会发生争夺资源的问题,所以谁都可以读到相同的数据,
(2)写者和写者是互斥关系,一个写的时候其他写者就不能写
(3)读者和写者是互斥关系,同步关系,类似生产者和消费者
读者写者会出现的问题:
(1)读者很多,写者只有一个的时候,读者会不断的来读数据,写者没机会写如数据,则会出现写者饥饿
(2)写者很多,读者只有一个的时候,写者会不断的写入数据,读者没机会写入数据,则会出现读者饥饿
针对写者饥饿和读者饥饿的解决方法:
(1)写者优先:当有很多读者的时候,当写者来的时候,后续来的读者就不能读了,等当前正在读的读者读完,然后让写者先写,其他读者不能进行读取
(2)读者优先:当有很多写者,来了一个读者的时候,当当前写者写完的时候让读者先读,读完了再让其他的写者写
关于读写锁:
(1)以只读方式加锁,是读者的行为,当有写者的时候,写者不会进行写操作,写者检测到读者有读锁的时候(Pthread_rwlock_tryrdlock(&rwlock)!=0) 会等待,直到读者不再读,如果没有检测到只读锁(Pthread_rwlock_tryrdlock(&rwlock)==0),则会直接写入
(2)其他锁是基于挂起,当申请锁的时候申请不到就会被挂起等待其他进程释放锁
(3)读写锁是基于自旋锁,申请锁资源,如果锁资源就绪,就会立即被占用,如果锁资源没有就绪,则会一直自旋申请
自旋锁:当申请资源的时候不会被挂起,节省了挂起和唤醒的代价
如果在临界资源里逗留的时间很长,则需要使用互斥锁或者信号量

生产者消费者 读者写者相关推荐

  1. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

    一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...

  2. 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结

    转自:http://www.cnblogs.com/kubixuesheng/p/4355786.html 进程:是个动态的概念,指的是一个静态的程序对某个数据集的一次运行活动,而程序是静态的概念,是 ...

  3. 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)

    文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...

  4. 2.3.6 操作系统之进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)

    文章目录 0.前言 1.生产者-消费者问题 (1)问题描述 (2)问题分析 (3)如何实现? (4)实现互斥的P操作一定要在实现同步的P操作之后 (5)知识回顾与重要考点 2.多生产者-多消费者问题 ...

  5. 操作系统:经典进程同步问题 之 生产者-消费者问题、读者-写者问题、哲学家进餐问题

    在进程同步中,经典的同步问题有:生产者-消费者问题.读者-写者问题.哲学家进餐问题. 一.生产者与消费者问题: 问题描述:使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品:只有缓冲区不 ...

  6. 模拟生产者-消费者问题和读者-写者问题

    生产者-消费者问题 一组生产者进程生产产品给一组消费者进程消费.一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得.生产者--消费者问题实际上是相互合作进程关系的一种 ...

  7. 生产者消费者问题、读者写者问题、哲学家问题细致讲解

    1.生产者消费者问题 ①系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用.[注:这里的"产品"理解为某种数据 ...

  8. java 读者写者_Java实现生产者消费者问题与读者写者问题详解

    1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两 ...

  9. java实现带界面的生产者消费者_Java实现生产者消费者问题与读者写者问题

    1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两 ...

最新文章

  1. CSS+HTML大白
  2. 29岁当上北大博导,她成2019年最年轻杰青建议资助人之一
  3. python分析犯罪数据_使用 SparkSQL 分析纽约市犯罪数据
  4. Go中对两个 nil 进行比较的结果是什么?
  5. centos7使用记录
  6. 【转】关于“Please install at least one language pack”的详
  7. asp英语是什么意思_如何在ASP.NET Core中使用JSON Patch
  8. 定义工作,解读自我——IT帮2019年2月线下活动回顾
  9. 5. soapui 测试
  10. 韩顺平java30天Utils包下的工具类
  11. 电脑重装系统虚拟机安装xp的教程
  12. chm打不开解决办法
  13. 手动设置ip 访问内网地址
  14. Class Not Found 的错误解决
  15. CSAPP第四章家庭作业参考答案
  16. 持久性连接和非持久性连接
  17. P1162 填图颜色 洛谷(BFS的简单应用)
  18. 测试nfs文件读写速度
  19. 从纪念碑谷的收益看小而美的游戏的盈利困境
  20. 【激光slam仿真】启动gazebo仿真环境报错[spawn_model-4] process has died

热门文章

  1. Vert.x简介、原理与HelloWorld
  2. Science Advances:胶质细胞功能障碍导致抑郁症静息态fMRI功能连接异常
  3. 2019最新计算机配置,Revit 2019 官方要求电脑及系统配置要求
  4. 郁金香热血江湖182c++整合lua脚本编译出错解决
  5. AVFoundation学习之视频播放
  6. 推动石化产业绿色循环发展 茂名天源石化碳三碳四项目
  7. NCE4 L1 Finding Fossil Man
  8. 今天晚上放纵了。《火蓝刀锋》、
  9. OpenNI的安装与配置
  10. neovim所处位置 linux,安装使用配置 Neovim