多生产者—多消费者问题(PV操作的简单例题)
在引入生产者消费者问题前,先要介绍几个知识点
1.临界区的相关问题。临界区是指每个进程访问临界资源的那段程序。临界资源是指每次只允许一个进程的访问的资源
2.PV操作,是一种利用信号量,通过while循环来控制进程的执行,以规避进程进入死锁状态
对于多生产者多消费者问题来说,其实最根本的和单生产者单消费者问题差不多
以下面这个例子来说明
■桌子上有一个盘子,每次只能放一个水果。爸爸专门向盘子中放苹果,妈妈专门放桔子,儿子等着吃盘中的桔子,女儿等着吃苹果。用P、V操作实现他们之间的同步。
Semaphore mutex=1,apple=0,orange=0, empty=1;Begin
Parbegin
Father: begin
Repeat
准备苹果
Wait(empty); 在确认盘中是否为空,若empty不为0,则可继续执行下面
Wait(mutex); 在确认其他进程是否在执行,若没有,则减一,开始后续操作
放入苹果; 生产者行为
Signal(mutex); 释放生产者动作,允许其他进程执行
Signal(apple); 生产者行为成功,给apple库存加一,允许后续消费apple进程执行
Until false;
end
**********************************************************************
Daughter:begin
Repeat
Wait(apple); 判断apple是否有有库存,若apple为0,则持续等待,否则减一并执行后续功能
Wait(mutex); 判断是否有其他进程正在执行,若有,持续等待
拿走苹果; 消费者行为
Signal(mutex); 释放资源,允许其他进程进入临界区
signal(empty); 释放资源,允许生产者进程进入临界区
Until false;
end
**********************************************************************
Parbegin
Mother: begin
Repeat
准备橘子
Wait(empty); 判断盘子是否为空,empty为1则执行下一步
Wait(mutex); 判断当前是否有进程占用临界区
放入橘子; 生产者行为
Signal(mutex); 释放资源,允许其他进程进入临界区
Signal(orange); 释放资源,允许消费者进程进入临界区
Until false;
end
**********************************************************************
Son:begin
Repeat
Wait(orange); 判断orange是否有有库存,若orange为0,则持续等待,否则减一并执行后续功能
Wait(mutex); 判断是否有其他进程正在执行,若有,持续等待
拿走橘子; 消费者行为
Signal(mutex); 释放资源,允许其他进程进入临界区
signal(empty); 释放资源,允许生产者进程进入临界区
Until false;
end
多生产者多消费者问题和单生产者单消费者问题本质上是差不多的。
生产者与消费者公用一个信号量来限制使用临界区资源
不同的消费者与不同的生产者对各自的产品与消费对象都用一个独立的信号量来控制,避免空等和错误使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)