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


    问题描述:

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

    解决方案:

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

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

  • 相关阅读:
    编译原理三大经典书籍
    c#之委托总结
    shell编程基础
    专家是什么?我真的想知道(转)
    linux sed
    判断一个脚本中的变量是否为空(转)
    JAVA Stack栈和Heap堆的区别(转)
    CMD获取当前目录的绝对路径 (转)
    RTP协议分析
    VS2010旗舰版安装图解
  • 原文地址:https://www.cnblogs.com/junfblog/p/12811616.html
Copyright © 2020-2023  润新知