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]);
        }
    }

                                                                                                                                                                                                 

  • 相关阅读:
    《需求工程-软件建模与分析之读书笔记之五》
    Neo4j (3.3.9)的学习之路(1)
    大数据培训第一天总结
    京东B2B业务架构演变阅读心得
    小米网抢购系统开发实践阅读心得
    余额宝技术架构及演进阅读心得
    美图数据统计分析平台架构演进阅读心得
    荔枝架构实践与演进历程阅读心得
    去哪儿网支付系统架构演进全历程阅读心得
    基于SOA质量属性的系统构架分析与实践
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12001244.html
Copyright © 2011-2022 走看看