操作系统考研习题讲解——生产者消费者习题001
Posted NightPoetry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统考研习题讲解——生产者消费者习题001相关的知识,希望对你有一定的参考价值。
目录
生产者消费者问题题解001
本次讲解分为常规解题讲解和题目分析两个部分,只求会解题的同学可以直接看第一部分,有疑问的可以继续看第二部分。
常规解题方法/解题思路:
最佳参考答案
semaphore mutex=1; //互斥使用取号机
semaphore empty=10; //空座位数量
semaphore full= 0; //已占座位数量
semaphore service=0; //等待服务
cobegin
{
process顾客i{
P(empty);
P(mutex);
从取号机获得一个号;
V(mutex);
V(full);
等待叫号;
P(service);//请求服务
获得服务;
}
process营业员{
while(TRUE){
P(full);
V(empty) ;
叫号;
V(service); //提供服务
为顾客服务;
}
}
}coend
注:在实际操作中,只能保证先有服务需求再有服务,但是不能保证是“为顾客服务”先执行还是 “获得服务”先执行。所以这个方法最符合题意但是不符合实际。
讲解
先使用“生产者-消费者模型”确定前半部分,在根据“互斥模型”确定叫号机周围的代码,然后根据“获得服务之前先要请求服务”的原则,使用P操作来请求资源。同时full信号量保证了是先有“服务请求”再有“服务提供”,所以不会出现V操作空转的情况,即不会提供大于请求量的“服务”。所以虽然后面的 “服务”也是“生产者-消费者模型”但是不需要提供类似empty的信号量,因为被前面的full给限制了。
如果取消P(service)操作,将会出现 “从取号机获得一个号”之后立刻执行“获得服务”操作,然后“顾客i”运行结束,然而此时还没有服务资源可以提供。
总体而言对于“座位”和“服务”两种“产品”使用“生产者-消费者模型”,对于 “叫号机”使用“互斥模型”,然后对代码逻辑进行整体化简去掉不必要的信号量即可。
题目分析
其他两种参考答案:
一、如果是顾客先准备的理解方式
semaphore mutex=1; //互斥使用取号机
semaphore empty=10; //空座位数量
semaphore full= 0; //已占座位数量
semaphore service=0; //等待服务
cobegin
{
process顾客i{
P(empty);
P(mutex);
从取号机获得一个号;
V(mutex);
V(full);
等待叫号
获得服务;(准备接受服务)
P(service);//准备完成,正式请求服务
}
process营业员{
while(TRUE){
P(full);
V(empty) ;
叫号
V(service); //得到一个准备好的顾客
为顾客服务;//开始服务
}
}
}coend
二、如果是服务先手准备的理解方式
semaphore mutex=1; //互斥使用取号机
semaphore empty=10; //空座位数量
semaphore full= 0; //已占座位数量
semaphore service=0; //等待服务
cobegin
{
process顾客i{
P(empty);
P(mutex);
从取号机获得一个号;
V(mutex);
V(full);
等待叫号
P(service);//获得一个准备就绪的服务
获得服务;
}
process营业员{
while(TRUE){
P(full);
V(empty) ;
叫号
为顾客服务(准备服务);
V(service); //通知顾客服务准备完成
}
}
}coend
注:虽然这是从两种不同的角度理解题目得出的解法,但是需要注意的是V(service)和P(service)必须一个在上面一个下面才能满足“生产者-消费之问题”的要求,在这里的作用是确定执行顺序,执行顺序是V前面的代码先执行,然后P后面的代码再执行。(因为开始service是0,所以必须先“V”(释放资源),然后“P”(请求资源)),这样就不会出现在“为顾客服务”和“获得服务”的先后逻辑不清晰的问题,保证这两个业务逻辑是有先后顺序,顺序执行的。
总而言之,对于以上这两种方法主要有两个模型,即“生产者-消费者模型”和“基于信号量的顺序控制模型”。
以上是关于操作系统考研习题讲解——生产者消费者习题001的主要内容,如果未能解决你的问题,请参考以下文章