操作系统——生产者消费者

有界缓冲问题
有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。

 模型:

int k;        //k个单位的缓冲区 
typedef anyitem item;    //item类型
item buffer[k];    //缓冲区 
int in=0,out=0,counter=0;    //in是生产者的定位 out是消费者的定位 counter是产品 

//生产者线程 
process producer(void) {
while (true)  {
    {produce an item in nextp}//生产下一个产品 
     if (counter==k)  //缓冲满时,生产者睡眠
           sleep(producer); 
   //sleep和wakeup系统内核函数,供应用程序调用
       buffer[in]=nextp;
       in=(in+1)%k;      //循环队列 
       counter++;         //产品       
       if(counter==1)    
       wakeup(consumer);  //唤醒消费者 
        }
   }
 
//消费者线程  
process consumer(void) {
    while (true) {     
    if (counter==0)   //缓冲区空,消费者睡眠
        sleep(consumer);
        nextc=buffer[out];
        out=(out+1)%k;     //循环对列 
        counter--;     //产品 
    if(counter==k-1) //取走一件产品,唤缓冲区有新的位置 
        wakeup(producer);      //醒生产者
    {consume the item in nextc};//消费产品
    }
} 

 

posted @ 2020-04-29 22:43  创造bug的夫  阅读(570)  评论(0编辑  收藏  举报