操做系統——生產者消費者

有界緩衝問題
有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};//消耗產品
    }
} 
相關文章
相關標籤/搜索