操作系统考研习题讲解——生产者消费者习题001

Posted NightPoetry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统考研习题讲解——生产者消费者习题001相关的知识,希望对你有一定的参考价值。

目录

生产者消费者问题题解001. 1

常规解题方法/解题思路:... 1

最佳参考答案... 1

题目分析... 3

其他两种参考答案:... 3

生产者消费者问题题解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的主要内容,如果未能解决你的问题,请参考以下文章

操作系统考研习题讲解——生产者消费者习题001

生产者消费者(练习题:容器)

Java自用线程通信-练习题

考研复习《操作系统原理》孟庆昌等编著课后习题+答案——第七章

体系结构 习题/题库/期末复习/考研复习

体系结构 习题/题库/期末复习/考研复习