(考研)黑电吃苹果同步互斥问题(附代码)
Posted 多情剑客无情剑;
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(考研)黑电吃苹果同步互斥问题(附代码)相关的知识,希望对你有一定的参考价值。
较为复杂的生产者-消费者问题:
问题描述
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈就可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿
可以从盘子中取出。
问题分析
1) 关系分析。这里的关系稍复杂一些,首先由每次只能向其中放入一只水果可知爸爸和妈妈是互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来,儿子和女儿之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发,如图2-8所示。
2) 整理思路。这里有4个进程,实际上可以抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上。
3) 信号量设置。首先设置信号量plate为互斥信号量,表示是否允许向盘子放入水果,初值为1,表示允许放入,且只允许放入一个。信号量 apple表示盘子中是否有苹果,初值为0,表示盘子为空,不许取,若apple=l可以取。信号量orange表示盘子中是否有橘子,初值为0,表示盘子为空,不许取,若orange=l可以取。解决该问题的代码如下:
semaphore plate=l, apple=0, orange=0; dad()//父进程
{ while (1) { prepare an apple; P(plate) ; //互斥向盘中取、放水果 put the apple on the plate; //向盘中放苹果 V(apple); //允许取苹果 } }
mom() { // 母亲进程 while(1) { prepare an orange; P(plate); //互斥向盘中取、放水果 put the orange on the plate; //向盘中放橘子 V(orange); //允许取橘子 } }
son(){ //儿子进程 while(1){ P(orange) ; //互斥向盘中取橘子 take an orange from the plate; V(plate); //允许向盘中取、放水果 eat the orange; } }
daughter () { //女儿进程 while(1) { P(apple); // 互斥向盘中取苹果 take an apple from the plate; V(plate); //运行向盘中取、放水果 eat the apple; } }
进程间的关系如图2-9所示。dad()和daughter()、mam()和son()必须连续执行,正因为如此,也只能在女儿拿走苹果后,或儿子拿走橘子后才能释放盘子,即V(plate)操作。
以上是关于(考研)黑电吃苹果同步互斥问题(附代码)的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研操作系统)第二章进程管理-第三节5:用信号量实现进程互斥同步和前驱关系
操作系统 王道考研2019 第二章:进程管理 -- 进程同步进程互斥(临界资源)实现临界区互斥的基本方法(软(单/双 标志Peterson )硬件(中断屏蔽TSSwap))饥饿
操作系统 王道考研2019 第二章:进程管理 -- 信号量机制(整型 / 记录型信号量)原语P / V操作用信号量机制实现进程互斥同步前驱关系