操作系统2020年8月生产消费者问题解析思路

首先我们先看题把题中的关键字找出来

通过题目中我们可以找到一下一些关键信息

1.仓库的使用权一次只能一个人用

2.蛋糕和箱子之间的关系,有箱子才能放蛋糕,没有箱子就不能放蛋糕,所以我们放蛋糕申请到仓库以后想要放必须要有箱子

3.根据过程它给出的函数对应的操作

4.题中给出的变量以及初值

好了,这些关键信息我们找完以后我们开始分析

 

蛋糕进仓库的这个代码过程

第一步

首先是再其它地方去了一个蛋糕,这是它的第一步

那么要填的空我们要思考,如果有了蛋糕我们需要考虑有没有箱子以及申请仓库的使用权,所以就要用到蛋糕与箱子数量差值的这个变量,第一就是先申请差值(这个差值可以理解为在仓库中又一个箱子可供使用)

所以第一个空就是

wait(delta)

第二步

我们申请完箱以后就要申请仓库的使用权,所以这一步就是我们申请仓库使用权

wait(depot)

然后蛋糕被放进去了,

第三步就是

signal(depot)

在用完仓库的使用权以后我们是要去释放的(可以理解为归还仓库钥匙)

现在我们到了箱子进仓库的代码了

可以看到开始和蛋糕的第一步的代码是一样的,但是我们要考虑一个问题就是在存放蛋糕的时候必须要有箱子才能放蛋糕,而存放箱子的时候没有蛋糕这个步骤所以我们

第一步

直接申请仓库使用权

wait(depot)

第二步

箱子被放进去以后我们就要出去了,所以要把仓库的钥匙归还

signal(depot)

然后可以看到在箱子这个循环中最后一句的代码是对蛋糕与箱子差值的进行了一个资源释放的操作,可以理解wait是-1的操作,而signal是+1的操作。需要注意再完成一个生产消费者的问题当中 wait signal 都是成对出现的,如果你做完题发现你的这两个关键字对不上号,那么必然是出现问题了。回去检查整个代码。

而这个题中整个的代码行走过程就

process putCake()
{while(true)
    {    
        fetchacake();
        wait(delta);   //在执行这一步的时候如果箱子的差值为0即仓库中没有箱子可以放蛋糕,那么就跳出这个循环
        wait(depot);   //申请仓库使用权
        putinacake();
        signal(depot); //释放仓库使用权
    }
}

porcess putBox()
{while(true)
    {
        fetchabox();
        wait(depot);  //申请仓库使用权
        putinabox();
        signal(depot); //释放仓库使用权
        signal(delta);  //对箱子与蛋糕差值进行一个资源释放的过程就是为里面放了一个资源,就是放了一个箱子
    }
}

猜你喜欢

转载自blog.csdn.net/pengjun_ge/article/details/115420423