操作系统基础知识整理

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

2017-06-02  本文已影响53人  saviochen

问题描述

一组生产者进程和一组消费者进程共享一个初始为空、大小为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;  //消费数据
     }
 }
上一篇下一篇

猜你喜欢

热点阅读