美文网首页操作系统基础知识整理
8.1 经典进程同步问题-生产者消费者

8.1 经典进程同步问题-生产者消费者

作者: saviochen | 来源:发表于2017-06-02 15:56 被阅读53次

    问题描述

    一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。

    问题分析

    1. 关系分析。生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。

    2. 整理思路。只有生产者和消费者两个进程,进程间存在着互斥关系和同步关系。只需在合理的位置设置PV操作即可。

    3. 信号量设置。信号量mutex作为互斥信号量,它用于控制互斥访问缓冲池,互斥信号量初值为1;信号量full用于记录当前缓冲池中“满”缓冲区数,初值为0。信号量empty 用于记录当前缓冲池中“空”缓冲区数,初值为n。

    方案一:记录型信号量

    生产者-消费者进程的描述如下:

    semaphore mutex=1; //临界区互斥信号量
    semaphore empty=n;  //空闲缓冲区
    semaphore full=0;  //缓冲区初始化为空
    producer () { //生产者进程
        while(1){
            produce an item in nextp;  //生产数据
            P(empty);  //获取空缓冲区单元
            P(mutex);  //进入临界区.
            add nextp to buffer;  //将数据放入缓冲区
            V(mutex);  //离开临界区,释放互斥信号量
            V(full);  //满缓冲区数加1
        }
    }
    
    consumer () {  //消费者进程
        while(1){
            P(full);  //获取满缓冲区单元
            P(mutex);  // 进入临界区
            remove an item from buffer;  //从缓冲区中取出数据
            V (mutex);  //离开临界区,释放互斥信号量
            V (empty) ;  //空缓冲区数加1
            consume the item;  //消费数据
        }
    }
    

    方案二:AND信号量

    生产者-消费者进程的描述如下:

     semaphore mutex=1; //临界区互斥信号量
     semaphore empty=n;  //空闲缓冲区
     semaphore full=0;  //缓冲区初始化为空
     producer () { //生产者进程
         while(1){
             produce an item in nextp;  //生产数据
             AND_P(empty, mutex);  //同时获取空缓冲区单元和临界区访问权
             add nextp to buffer;  //将数据放入缓冲区
             AND_V(mutex, full);  //离开临界区,增加产品数量
         }
     }
    
     consumer () {  //消费者进程
         while(1){
             AND_P(full, mutex);  //同时获取产品和临界区访问权
             remove an item from buffer;  //从缓冲区中取出数据
             AND_V (mutex, empty);  //离开临界区,增加空缓冲区数量
             consume the item;  //消费数据
         }
     }
    

    相关文章

      网友评论

        本文标题:8.1 经典进程同步问题-生产者消费者

        本文链接:https://www.haomeiwen.com/subject/jnzffxtx.html