admin管理员组文章数量:1026073
哲学家就餐问题之解
摘 要:
本文讨论了如何使用信号量解决操作系统中经典的哲学家就餐问题,探讨了并发进程进行同类资源竞争所引发的进程死锁,饥饿的相关解决方案;在多道程序的系统环境中,由于资源的数量远远不能满足并发进程的需求,并发进程执行过程中要进行同类资源竞争,但是随之带来的就是进程死锁和进程饥饿。为此,引入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方案二&
哲学家就餐问题之解
摘 要:
本文讨论了如何使用信号量解决操作系统中经典的哲学家就餐问题,探讨了并发进程进行同类资源竞争所引发的进程死锁,饥饿的相关解决方案;在多道程序的系统环境中,由于资源的数量远远不能满足并发进程的需求,并发进程执行过程中要进行同类资源竞争,但是随之带来的就是进程死锁和进程饥饿。为此,引入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方案二&
版权声明:本文标题:哲学家就餐问题解决方案整合 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1741199947a1846720.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论