操作系統——理發師問題


問題描述:

理發店理有一位理發師、一把理發椅和n把供等候理發的顧客坐的椅子 如果沒有顧客,理發師便在理發椅上睡覺 一個顧客到來時,它必須叫醒理發師 如果理發師正在理發時又有顧客來到,則如果有空椅子可坐,就坐下來等待,否則就離開

程序模型:

int waiting=0;//等候理發顧客數
int CHAIRS=N; //為顧客准備的椅子數
semaphore customers,barbers,mutex;//信號量 
customers=0;// 顧客 
barbers=0;//理發椅上人數 
mutex=1;//互斥信號量 

//理發師 
process barber( ) {
 while(true) {
 P(customers); //有顧客嗎?若無顧客,理發師睡眠
 
 P(mutex);          //若有顧客時,進入臨界區
    waiting--;      //等候顧客數少一個
    V(barbers);        //理發師准備為顧客理發
 V(mutex);          //退出臨界區
   
    cut_hair();     //理發師正在理發(非臨界區)
    }
}

//顧客 
process customer_i( ) {
  P(mutex);             //進入臨界區
 
  if(waiting<CHAIRS) {  //有空椅子嗎
        waiting++;       //等候顧客數加1
        V(customers);      //喚醒理發師
  V(mutex);          //退出臨界區
    
    P(barbers);     //理發師忙,顧客坐下等待
    get_haircut();   //否則顧客坐下理發
      }
  else
  
   V(mutex);          //人滿了,走吧!
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM