zoukankan      html  css  js  c++  java
  • 操作系统(哲学家进餐问题)

     哲学家进餐问题:有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们共用一张园桌,分别坐在周围五张椅子上。在圆桌上五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进程毕,放下筷子又继续思考。

    问题分析:

    筷子是临界资源,一次只能被一个哲学家使用。因此,五个人不能同时拿起左边的筷子(或右边)否则或引起死锁。

    解决方案:

    (1)至多只允许四位哲学家同时拿左边的筷子,最终保证有一位哲学家能够进餐,并且用完能够释放筷子,让更多的哲学家进餐。

    (2)仅当哲学家左右两只筷子都可以用的时候,才允许拿筷子进餐。

    semaphore chopstick[5]={1,1,1,1,1};//五个信号量,一个信号量代表一只筷子 
    semaphore mutex=1;
    Pi(){
        while(1){
            wait(mutex);//设置信号量,防止其它人争夺资源 
            wait(chopstick[i]);
            wait(chopstick[(i+1)%5]);
            signal(mutex);//拿到两只筷子后释放信号量 
            吃饭;
            signal(chopstick[i]);//吃过饭后,释放筷子资源 
            signal(chopstick[(i+1)%5]);
        }
    }

    (3)奇数号哲学家先拿左边的,再拿右边的;偶数则相反。即五位哲学家都先竞争奇数号筷子,获得后再去竞争偶数号筷子,最终总会有一位哲学家有两只筷子。

    semaphore chopstick[5]={1,1,1,1,1};
    Pi(){
        while(1){
            if(i%2!=0){//奇数号哲学家 
                wait(chopstick[i]);//拿左边的 
                wait(chopstick[(i+1)%5]);//右边的 
            }else{//偶数号哲学家 
                wait(chopstick[(i+1)%5]);//右边的 
                wait(chopstick[i]);//左边的 
            }
            进餐; 
            signal(chopstick[i]);//释放筷子资源 
            signal(chopstick[(i+1)%5]);
        }
    }

                                                                                                                                                                                                 

  • 相关阅读:
    子组 正则表达式
    正则表达式
    马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?-2014-03-20
    形象化的spring 依赖注入原理
    程序员的六层境界
    apache配置运行zendframework 2
    php编写简单的页面跳转功能
    php随机验证码
    没啥说的
    PHP流程控制语句下
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12001244.html
Copyright © 2011-2022 走看看