计算机操作系统学习之吸烟者问题

一.问题描述

  • 系统中有三个吸烟者进程一个供应者进程
  • 每个吸烟者不停的卷烟并吸掉它,而卷烟需要三种材料:烟草、纸和胶水
  • 三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三个拥有胶水
  • 而供应者每次将两种材料放在桌子上,拥有剩下的那种材料的吸烟者拿走桌子上的材料卷一根烟并吸掉它,并且发出完成信号告诉供应者进程自己完成了
  • 然后供应者就会放另外两种材料在桌子上,这个过程一直重复
  • 也就是可生产多种类型产品的单生产者-多消费者问题
    在这里插入图片描述

二.问题分析

1.关系分析

分析题中各个进程的互斥和同步关系

  • 首先将桌子视为大小为1的缓冲区
  • 放在桌子上的东西有三种组合:组合一(纸+胶水),组合二(烟草+胶水),组合三(烟草+纸)
  • 互斥关系:由于缓冲区大小为1,因此即使不设置互斥信号量,也可以实现互斥访问
  • 同步关系1:桌子上有组合一,然后第一个抽烟者取走东西
  • 同步关系2:桌子上有组合二,然后第二个抽烟者取走东西
  • 同步关系3:桌子上有组合三,然后第三个抽烟者取走东西
  • 同步关系4:发出完成信号,然后供应者进程在桌子上放另一个组合

2.整理思路

根据各进程的操作流程,大致上确定P、V操作的执行顺序

  • 即就是在每个同步关系中进行“前V后P”

3.设置信号量

  • 设置需要的信号量,并根据题目设置初值
  • 互斥信号量初值一般为1
  • 同步信号量初值根据对应资源的初始值确定

在这里插入图片描述
在这里插入图片描述

4.具体实现

(1)对于供应者进程

在这里插入图片描述

  • 使用一个变量 i 来实现轮流将三个组合放到桌子上
  • i 的初始值为0,每次放完东西都让i+1,根据i%3的值实现轮流循环的将各个组合放上桌子
  • 当供应者放完东西,对信号量finish执行P操作,由于此时还没有吸烟者进程拿走东西,因此供应者进程会阻塞到这里,直到有吸烟者进程拿走东西。

(2)对于吸烟者进程

在这里插入图片描述

  • 吸烟者进程先检查自己对应的组合的信号量,如果桌子上没有该组合,则阻塞,如果有那就拿走该组合
  • 并且在拿走之后对信号量finish执行V操作,也就是发出了完成信号
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值