生产者-消费者问题从特殊到一般(从易到难)可以分3种形式:

一个生产者、一个消费者、一个缓冲区的问题;

一个生产者、一个消费者、n个缓冲区的问题;

k个生产者、m个消费者、n个缓冲区的问题;

当缓冲区空时,生产者可将产品存入缓冲区;当缓冲区满时,生产者必须等待 (阻塞),待消费者取走产品后将其唤醒后,才能将产品存入。

当缓冲区有产品时,消费者可从缓冲区取出产品进行消费;当缓冲区空时,消费者必须等待(阻塞),待生产者存入产品后将其唤醒后,才能再从缓冲区取产品。
1.为生产者设置1个私有信号量empty,其初值为1,表示有1个空缓冲区;为消费者设置1个私有信号量full,其初值为0,表示开始时没有满缓冲区;(信号量初值由物理意义确定
2.生产者将产品存入缓冲区之前,应先测试缓冲区是否空:执行wait(empty)操作;离开临界区(存入产品)后,应通知(可能会唤醒)消费者:执行signal(full)操作;
3.消费者从缓冲区取产品之前,应先测试缓冲区是否满:执行wait(full)操作;离开临界区(取走产品)后,应通知(可能会唤醒)生产者:执行signal(empty)操作

一个生产者、一个消费者、一个缓冲区


生产者消费者问题的算法描述如下所示:

初始化设置

semaphore empty,full;
empty=1;full=0;

生产者

parbegin
process Producer:
{ produce an item in nextp;wait(empty);//测试buffer=nextp;signal(full);//通知消费者
}

消费者

process Consumer:
{wait(full); //测试nextc=buffer;signal(empty); //通知consume the itemin nextc;
}
parend

信号量机制解决进程同步问题的一般方法:

1.为同步双方设置各自的信号量,初值为其初始状态可用的资源数(故该信号量称为资源信号量私有信号量)
2.同步双方任一进程在进入临界区之前,应先对自己的信号量执行wait(<己方信号量>)操作,以测试是否有自己可用的资源。若有资源可用,则进入临界区,否则阻塞;
3.同步双方任一进程离开临界区后,应对合作方 (对方)的信号量执行signal(<对方信号量>)操作,以通知(若对方处于阻塞状态,则唤醒它)对方已有资源可用(对方已可进入临界区)。

一个生产者、一个消费者、n个缓冲区


        为生产者设置一个资源信号量empty,其初值为生产者的可用资源数(空缓冲区的个数)n,即empty=n
        为消费者设置一个资源信号量full,其初值为消费者的可用资源数(满缓冲区的个数)0,即full=0

生产者消费者问题的算法描述如下所示:

初始化设置

​​​​​​​semaphore empty,full;
empty=n;full=0;
int in=0,out=0;   //下标

生产者

parbegin
process Producer:
{ produce an item in nextp;wait(empty);//测试buffer[in]=nextp;in=(in+1)%n;signal(full);//通知消费者
}

消费者

process Consumer:
{wait(full); //测试nextc=buffer[out];out=(out+1)%n;signal(empty); //通知consume the item in nextc;
}
parend

本题中inout不是共享变量(因为只有一个生产者和一个消费者),无需互斥访问。

一个生产者、一个消费者、n个缓冲区


1、设置生产者的资源信号量empty,其初值为n,表示开始时有n个空缓冲区;
2、设置消费者的资源信号量full,其初值为0,表示开始时有0个满缓冲区;
3、只要有空的缓冲区,生产者便可将消息送入缓冲区;
4、只要有满的缓冲区,消费者便可从缓冲区取走一个消息。
5、用互斥信号量mutex对缓冲区(共享变量inout)的互斥使用,互斥信号量mutex初值为1
6、生产者用共享变量in作为下标访问缓冲区,mutex为其互斥信号量;消费者用共享变量out作为下标访问缓冲区,其互斥信号量也用mutex

初始化

semaphore mutex,empty,full ;
item buffer[n] ;
int in = 0,out = 0 ;
mutex.value = 1;
empty.value=n,full.value=0;

生产者

parbegin //并发执行开始
process produceri (i=1,2,…,k)  //生产者进程
{item nextp;while (true){  produce an item nextp;wait(empty) ;    //测试是否有可用的资源wait(mutex);        //互斥(进入临界区)buffer[in] = nextp ;in = (in + 1)% n ;signal(mutex) ;  //退出临界区signal(full) ;    //通知(可能唤醒)协作方}
} 

消费者

process consumerj (j=1,2,…,m)
{  item nextc ;while (true)   {wait(full); //测试是否有可用的资源wait(mutex);nextc = buffer[out] ;out = (out + 1)% n ;signal(mutex);//生产者消费者互斥访问缓冲区,同时生产者互斥生产,消费者户次消费signal(empty); //通知(可能唤醒)协作方consume the item in nextc ;}
}
parend //并发执行结束

注意:


在每个进程中,实现互斥的wait(mutex)signal(mutex)必须成对出现;
对资源信号量empty和fullwaitsignal操作也要成对地出现,但它们处于不同的进程中(交叉成对)
在每个进程中的多个wait操作顺序不能颠倒,应先执行对资源信号量(也称私有信号量)的wait操作,然后执行对互斥信号量(公有信号量)的wait操作,否则可能引起进程死锁。

重申信号量解决同步问题的要点:


1.为同步双方设置各自的信号量,初值为其初始状态可用的资源数(故该信号量称为资源信号量私有信号量)
2.同步双方任一进程在进入临界区之前,应先对自己的资源信号量执行wait(<己方信号量>)操作,以测试是否有自己可用的资源。若有资源可用,则进入临界区,否则阻塞;
3.同步双方任一进程离开临界区后,应对合作方 (对方)的资源信号量执行signal(<对方信号量>)操作,以通知(若对方处于阻塞状态,则唤醒它)对方已有资源可用(对方已可进入临界区)

生产者-消费者问题(操作系统)相关推荐

  1. 生产者消费者问题 操作系统

    2.15 生产者消费者问题 Dijkstra对同步问题的抽象 抽象解释 一个或多个生产者生产资源,放入临界区 一次仅有一个消费者访问临界区并消耗资源 每次仅有一名生产者/消费者访问临界区 临界区满时生 ...

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

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

  3. 操作系统课设--使用信号量解决生产者/消费者同步问题

    山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...

  4. 操作系统(二十三)生产者消费者问题

    2.3.6 生产者消费者问题 生产者消费者问题(The proceducer-consumer problem)是一个经典的进程同步的问题,问题是这样描述的:在操作系统中有一组生产者进程一组消费者进程 ...

  5. 生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题

    在上一篇操作系统基础14提到通过信号量解决生产者消费者问题.本篇来详细说说操作系统中的经典问题-生成者消费者问题 生产者消费者问题 (Producer-consumer problem) 该问题是一个 ...

  6. 【操作系统】实验 生产者-消费者问题解决方案

    生产者-消费者问题 生产者-消费者问题,也称有界缓冲问题,属于操作系统进程同步的经典问题,在多线程并发编程中也是经典案例,值得去学习. 有一个生产者线程和一个消费者线程,生产者生产资源到资源缓冲区,消 ...

  7. 【操作系统/OS笔记13】信号量、PV操作、管程、条件变量、生产者消费者问题

    本次笔记内容: 10.1 背景 10.2 信号量 10.3 信号量的使用 10.4 信号量的实现 10.5 管程 文章目录 信号量的提出背景 信号量(semaphore) 信号量数据类型 信号量类似铁 ...

  8. 操作系统实验 生产者消费者问题详解

    操作系统课程设计 生产者消费者实验报告 一.实验目的 加深对进程概念的理解,明确进程与程序的区别. 认识并发执行的本质. 理解和掌握Linux和Windows进程通信系统调用的功能,通过实验和学习,提 ...

  9. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

  10. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

最新文章

  1. Android自定义流式布局-FlowLayout
  2. 将一种文本类型安全的转化为另一种类型
  3. java线程池的使用
  4. [YTU]_2532(投简历)
  5. php用正则_php 正则表达式匹配(持续更新)
  6. C# 中用DES 对称Key,IV 加密,前端crypto.js 解密
  7. wireshark 分析mptcp ecn语句
  8. Java中常见的设计模式
  9. java 调用 pb dll_[转载]一个java调用delphi写的dll问题,郁闷了一天一晚解决
  10. 逍遥模拟器微信提示无法连接服务器,逍遥模拟器无法连接网络怎么办?
  11. 华中科技大学计算机免试,华中科技大学计算机学院2015年接收推荐免试研究生待录取结果公示...
  12. Dear小弟×××,给你们的一封信「社区运营入门系列 序」
  13. 【AI语音】九联UNT402A_通刷_纯净精简_免费线刷固件包
  14. 03 分布式系统的技术栈
  15. c语言指针 —— 面试题
  16. Lazada代运营分享—Lazada新手运营快速提升流量交易额的三大核心技巧
  17. dz论坛ucenter打不开mysql,Discuz! X3搬家后UCenter出现UCenter info: MySQL Query Error解决方案...
  18. 解决 XXX cannot be resolved or is not a field 问题
  19. 联想y7000-2019黑苹果安装笔记(自用)
  20. CentOS7.6 安装配置Amber18/AmberTools18(GPU加速版)

热门文章

  1. 新浪微博搜索页用户信息爬取
  2. FragmentPagerAdapter刷新notifyDataSetChanged无效
  3. 什么是digg?digg 是什么
  4. posix_spawn函数
  5. 美国老姐看完200+中国学生SCI论文,怒写超详细“中国人英文论文写作指南”!还被推上了B站热门…...
  6. 形形色色的图片格式详解
  7. 802.3af与802.3at区别及PSE与PD名词解释
  8. 华为 android 安全,华为 EMUI/Magic UI 安全更新 2020-3
  9. 基于SSM java jsp汽车俱乐部网站
  10. 操作系统——内存分配管理