本文章默认的前置条件:
- 面向正在看或刚看完(王道考研操作系统中)生产者—消费者问题和多生产者—多消费者问题这【两节】的学习者们;
- 且对生产者—消费者问题中empty和full同步信号量产生疑惑;
- 对多生产者—多消费者问题中plate、orange、apple同步信号量产生疑惑;
- 非专业性文章,作为个人向的思路,仅供大家辅助理解之用。
目录
在生产者—消费者问题中,为什么使用empty和full两个同步信号量?直接用一个同步信号量不行吗?
- 如果你观察了记录性信号量的话,就会发现,“0”是一个很独特的分界线。我们可以得出结论,每个信号量有且只有“0”这一个分界线。(仅供理解哈)
- 生产者—消费者问题明显有两个分界线——产品为0时,让消费者进入堵塞;产品满了的时候,让生产者进入堵塞。(说白了就是区间[0,5],同时拥有最大值和最小值)
- 如果只使用一个信号量,就无法同时满足两个分界线。(比如会出现生产者超额生产的情况)
- 使用两个信号量的话,当empty<0,生产者就会进入堵塞;当full<0,消费者就会进入堵塞;
- 结论——如果一个值同时拥有最大值和最小值,那么它一定涉及两【种】同步信号量之间的转换。(可以结合下图进行理解)
在多生产者—多消费问题中,为什么这个问题中没有像上个问题一样使用full和empty两种同步信号量呢?
- 首先,两个问题的结构是相似的,盘子容量这个变量,也依旧同时拥有最大值和最小值这两个分界线。
- 所以,这个问题中依旧涉及了两种同步信号量之间的转换。只不过orange、apple被视作【同一种】同步信号量,代替了上个问题中full的位置。
- 结论:在这个问题中,它将empty→plate,full→orange、apple。而结构是极其相似的。