操做系统——哲学家进餐问题

问题描述: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);
         }
      }

     

(方案不少,但尽量的找到最优的方案)进程

相关文章
相关标签/搜索