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