操作系统 --经典同步问题之生产者-消费者(六)

一、生产者-消费者问题

问题描述:

  • 生产者、消费者进程共享一个初始为空、大小为n的缓冲区。(初始空闲缓冲区的数量为n,非空闲的数量为0)
  • 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。(同步关系,缓冲区满时,生产者要等待消费者取走产品)
  • 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。(同步关系,缓冲区空时,消费者要等待生产者放入产品)
  • 缓冲区是临界资源,各进程必须互斥地访问。(互斥关系)

问题分析:

1、关系分析

生产者和消费者对缓冲区的访问是互斥关系,同时生产者和消费者又是一个协作的关系,只有生产者生产之后,消费者才可以消费,因此又是同步关系。

2、整理思路

两个进程之间存在着互斥关系和同步关系。那么需要解决的是互斥和同步PV操作的位置。

3、信号量设置。

  • 互斥信号量mutex,初始值为1,实现对缓冲区互斥访问
  • 同步信号量full,表示当前非空缓冲区的数量,初始值为0
  • 同步信号量empty,表示当前空闲缓冲区的数量,初始值为n

实现:

思考:能否改变相邻P、V操作的顺序?

有时候是消费者等待生产者生产,有时候是生产者等消费者消费,这是两个不同的 “一前一后问题”

因此也需要设置两个同步信号量

二:多生产者-多消费者

问题描述:

桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子放苹果,妈妈专向盘中放橘子。儿子专吃盘中橘子,女儿专吃苹果。只有盘中为空,爸爸或妈妈才可以向盘子放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿才可以从盘中取出

问题分析:

1、关系分析

首先由每次只能向盘中放一个水果,可知爸爸和妈妈是互斥关系。爸爸和女儿,妈妈和儿子是同步关系

2、整理思路

这里4个进程,实际可以抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上

3、信号量设置

首先设置信号量plate为互斥信号量,表示是否向盘中放水果,初始值为1,表示允许放入,且允许放入一个

信号量apple表示盘中苹果的数量,初始值为0,表示盘中为空,不允许取

信号量orange表示盘中橘子的数量,初始值为0,表示盘中为空,不允许取

实现一(切记:前V后P):

实现二(不用互斥信号量):

 如果缓冲区大小大于1,就必须要设置互斥信号量了

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值