哲学家就餐问题解决方案整合

哲学家就餐问题之解

摘  要:

本文讨论了如何使用信号量解决操作系统中经典的哲学家就餐问题,探讨了并发进程进行同类资源竞争所引发的进程死锁,饥饿的相关解决方案;在多道程序的系统环境中,由于资源的数量远远不能满足并发进程的需求,并发进程执行过程中要进行同类资源竞争,但是随之带来的就是进程死锁和进程饥饿。为此,引入PV操作和信号量,对并发进程执行进行条件控制,使得并发进程在在竞争同类资源时不会出现以上两种状况,以达到并发进程正常执行的目的。

关键词:哲学家问题,操作系统,P操作、V操作,进程同步与互斥,资源分配


1. 引言:

哲学家就餐问题由Dijkstra提出的多进程之间同步访问有限资源的著名案例,哲学家进餐问题(如图1-1所示)讲述了五名哲学家围坐在一张圆桌旁,桌子中央有一盘通心面,每个人面前有一个空盘子,每两个人之间放一只筷子(每位哲学家进餐是一个进程,筷子是竞争的临界资源)。在进餐时,每个人只能从自己的左边和右边取筷子,要同时拿到两根筷子哲学家方能就餐;就餐完毕后,哲学家将手中的筷子放回原位,并进入思考状态;如果不能同时拿到两根筷子,哲学家进入饥饿状态;如果每位哲学家仅拿到一只筷子,都等待相邻哲学家放下筷子,每位哲学家将会都将会无休止的等待下去,陷入死锁。为了使每位哲学家都能顺利就餐,以下提供了几种不同解决方案!

          图1-1

2. 求解方法

2.1方案一:

设置互斥信号量,每次至多4个哲学家进餐

五位哲学家同时进餐的情况下,如果每位哲学家都先拿起自己左边或右边的筷子,那么每个哲学家就都拿到了一只筷子,而无休止的等待旁边的哲学家放下筷子,结果他们都不能进餐,出现进程死锁!为防止出现的危险,考虑每次至多允许4位哲学家同时进入餐厅,第5位只有在已进入就餐的哲学家退席后才去就餐。此时最多4位哲学家哲学家就坐,因此至少保证有一位哲学家能够拿到左右两只筷子,从而完成就餐。

为此,5只筷子互斥使用,筷子编号0-4,对应设置五个初值为1的互斥信号量,此外,餐厅仅提供4个位子,需设置初值为4的同步信号量seat管理4个位置,即:

P(Chopstick[i])//拿起筷子

V(Chopstick[i])//放下筷子

P(seat)//哲学家进入餐厅申请位置

V(seat)//哲学家就餐完毕归还位置

第i(0<=i<=4)个哲学家“思考-就餐-思考过程”代码描述如下:

Philosopher(i)

{

While(TRUE)

{

Think();//哲学家思考

P(seat);

P(Chopstick[i]);

P(Chopstick[(i+1)mod 5]);

//哲学家拿起相邻筷子

Eat();

//哲学家就坐

V(Chopstick[i]);

V(Chopstick[i+1]);

V(seat);//就餐完毕,离席

}

}

 

 

2.2方案二&

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值