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

问题描述:

有五个哲学家围坐在一圆桌旁,桌*有一盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子。

解决方案:

  • 至多允许四个哲学家同时吃;
      
    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);
         }
      }

     

(方案很多,但尽可能的找到最优的方案)

上一篇:提交文件目录到github,显示没有权限问题


下一篇:Java并发包(1):CountDownLatch、CyclicBarrier、Semaphore