操作系统进程同步例题(四)生产者-消费者问题

题目: 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)

要求:

  1. 生产者、消费者共享一个初始为空、大小为n的缓冲区。
  2. 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
  3. 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
  4. 缓冲区是临界资源,各进程必须互斥地访问。

试用P、V操作实现上述进程

PV操作题目分析步骤:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

1、分析

首先有生产者和消费者两个进程,往缓冲区放入/取走产品需要互斥,两个进程互斥访问缓冲区,为互斥关系,信号量需要设置互斥信号量mutex = 1,互斥访问缓冲区;

然后生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品。消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)为两对同步关系,生产者生产–>消费者消费,消费者消费–>生产者生产,设置两个同步信号量full = 0,empty = n。分别表示产品数量和空闲缓冲区数量。

2、伪代码

semaphore full = 0; //同步信号量,产品数量
semaphore empty = n; //同步信号量,空闲缓冲区数量
semaphore mutex = 1; //互斥信号量,互斥访问缓冲区//生产者进程
Product() {while(1) {product(); //生产一个产品P(empty); //申请消耗一个空闲缓冲区P(mutex); //申请访问互斥缓冲区put(); //将产品放入缓冲区V(mutex); //释放缓冲区V(full); //增加一个产品}
}//消费者进程
Comusmer() {while(1) {P(full); //申请消耗一个产品P(mutex); //申请访问互斥缓冲区get(); //从缓冲区取一个产品V(mutex); //释放缓冲区V(empty); //增加一个空闲缓冲区use(); //适用}
}

注:

  1. 实现互斥的P操作一定要在实现同步的P操作之后。
  2. 实现互斥是在同一进程中进行一对PV操作。
  3. 实现两进程的同步关系,是在其中一个进程中执行P,另一进程中执行V,同步关系前“V”后“P”。

操作系统进程同步例题(四)生产者-消费者问题相关推荐

  1. 操作系统进程同步例题(三)汽车过桥2

    操作系统进程同步例题(三)汽车过桥2 题目1: 在一个只允许单向行驶的十字路口,分别有若干由东向西,由南向北的车辆在等待通过十字路口.为了安全,每次只允许一辆车通过(比如:东到西或南到北).当有车辆通 ...

  2. 操作系统进程同步例题(一)上机实习

    操作系统进程同步例题(一)上机实习 题目: 某高校计算机系开设网络课并安排上机实习,设机房有共有2m台机器,有2n名学生选该课,规定: (1)每2个学生组成一组,各占一台机器,合作完成上机实习 (2) ...

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

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

  4. 【操作系统】Semaphore处理生产者-消费者问题

    "生产者-消费者"问题 问题描述 问题分析 关系分析 求解思路 信号量设置 问题解决 复杂情况的求解示例 问题描述 一组生产者进程和一组消费者进程共享一个初始为空.大小为n的缓冲区 ...

  5. 操作系统 - C语言实现生产者消费者问题

    同步互斥问题 - 生产者消费者问题 问题描述: 有多个进程:多个生产者进程和多个消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造数据,只有缓冲区没满时,生产者才能把消息放入 ...

  6. 【操作系统】多线程、生产者——消费者同步与互斥代码实现

    简述: 两进程同步关系,有两个信号量,一个empty一个full. 假设产品缓冲区大小为n,则初值empty=n,full=0. 前操作(生产者):   P(empty)   V(full) 后操作( ...

  7. 作业必备:操作系统实验六【生产者消费者实验:用信号量实现PV操作】

  8. 多线程-线程通信:生产者消费者例题

    /*** 线程通信的应用:经典例题:生产者/消费者问题** 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,* 店员一次只能持有固定数量的产品( ...

  9. 【Java】线程通信的例子:用两个线程打印 1-100;生产者消费者问题

    wait()和sleep()的区别 面试题:sleep() 和 wait()的异同? 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态. 不同点: 1)两个方法声明的位置不同:Thread类中声 ...

  10. 锁, threading.local, 线程池, 生产者消费者模型

    一. 锁:Lock (1次放1个) 线程安全,多线程操作时,内部会让所有线程排队处理.如:list/dict/Queue     线程不安全 + 人 => 排队处理. 需求:         a ...

最新文章

  1. 【代码片段】如何使用CSS来快速定义多彩光标
  2. ajax获取php echo值,ajax 接受 php echo 与 return 区别
  3. Android移动开发之【Android实战项目】实现每天定时提醒的功能
  4. 《软件过程改进》练习题
  5. thymeleaf依赖_玩转SpringBoot集成 Thymeleaf 模版引擎
  6. C++ static、const对象声明与定义 问题来源?
  7. Apple Watch移动心电图ECG与房颤提示功能获药监局审核
  8. php array_reduce 降维,使用array_reduce降维
  9. 4个独立按键实现对数码管数字显示的加减清零等
  10. Linux文件导出到Windows乱码的问题
  11. 从你的全世界路过-人到难处需放胆
  12. vue路由vue-router的使用
  13. linux python测试程序,linux下测试python程序执行时间
  14. linux Sprintf中文乱码,Linux下printf、fprintf、sprintf的区别
  15. 如何把JSON对象转为map对象
  16. 【技术分享】孙玄:MongoDB在58同城的应用实践
  17. 用华为手机拍照别直接按快门,先打开这个按钮,效果翻倍堪比单反
  18. python3.0编程软件_震惊!国内已知第一款Scratch 3.0编程软件KittenBlock推出Python编程功能!...
  19. wamp的Laravel项目的Apache虚拟主机域名绑定和端口修改(实用)
  20. 大学计算机专业分为哪几类

热门文章

  1. DOTA数据集 | 数据前后处理操作系列
  2. 如何去掉图片上的水印,四个步骤,方法超级容易又简单
  3. 阿里、百度、搜狐等公司社招面试记录与总结
  4. android 拨号盘按键移位,手机拨号盘的隐藏功能!这两个键的作用,99%的人不知道!...
  5. Android版本名称
  6. 在vue中使用iconfont多色图标
  7. LA 4670 Dominating Patterns AC自动机简单题
  8. idea无法下载源代码
  9. Pizza店(JAVA程序设计)
  10. JAVA抓取商品价格_使用JAVA爬取京东商品价格