操做系統——哲學家進餐問題

問題描述:spa

有五個哲學家圍坐在一圓桌旁,桌中央有一盤通心麪,每人面前有一隻空盤於,每兩人之間放一把叉子。每一個哲學家思考、飢餓、而後吃通心麪。爲了吃麪,每一個哲學家必須得到兩把叉子,且每人只能直接從本身左邊或右邊去取叉子。code

解決方案:blog

  • 至多容許四個哲學家同時吃;
      
    Semaphore fork[5]={1,1,1,1,1};
    Semaphore footman=4;//最多容許4個哲學家進程同時進行 
    cobegin
    process philosopher_i() ){/*i=0,1,2,3,4 */
    while(true) {
       P(footman); 
      Think(); 
      P(fork[i]);  
      P(fork[(i+1)%5]);
      Eat(); 
      V(fork[i]); 
      V(fork[(i+1)%5]);   
      V(footman); 
       }
     } 

     

  • 奇數號先取左手邊的叉子,偶數號先取右手邊的叉子;
  • 每一個哲學家取到手邊的兩把叉子才吃,不然一把叉子也不取。
  • 系統中只容許有四個進程
    semaphore fork[5];
    for (int i=0;i<5;i++)
       fork[i]= 1;
       
    process philosopher_i( ){/*i=0,1,2,3 */
       while(true) {
        think( );
        P(fork[i];       /*i=4,P(fork[0])*/
        P(fork[(i+1)%5] );/*i=4,P(fork[4])*/
        eat( );
        V(fork[i]);
        V(fork([i+1]%5);
         }
      }

     

(方案不少,但儘量的找到最優的方案)進程

相關文章
相關標籤/搜索