和尚打水问题(多生产者多消费者):
问题描述:某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为n个。每次入水、取水仅为一桶,且不可同时进行。
信号量设置:
- 1.对于水缸——以一个水桶水为单位,empty=10、full = 0两个计数信号量
- 小和尚对缸操作:mutex-jar = 1二元信号量;
- 水桶个数(资源数):bucket = n计数信号量
- 取水操作(每次入水、取水仅为一桶):互斥mutex-well = 1二元信号量;
伪代码:
吃水果问题(多生产者多消费者):
问题描述:桌上有一只盘子,最多可容纳一个水果,每次只能放人/取出一个水果。父亲专向盘子中放苹果(apple),母亲专向盘子中放橘子(orange),儿子专等吃盘子中的橘子,女儿专等吃盘子里的苹果。试设计信号量并使用P、V操作同步父,母、子、女进程。
吸烟者问题-单生产者多消费者问题
问题描述:假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)。
可生产多种产品的单生产者以及多消费者问题。
生产者可生产的产品一共有三种:
组合一:纸+胶水;组合二:烟草+胶水;组合三:烟草+纸。
互斥关系:桌子可以看作是一个容量为1的缓冲区,其访问是互斥的;
同步关系:桌上有组合一之后第一个抽烟者取走组合一;
桌上有组合二之后第二个抽烟者取走组合二;
桌上有组合三之后第三个抽烟者取走组合三;
取走东西使用完成后供应者将下一个组合放到桌子上。
伪代码: