操作系统自学(十五)哲学家进餐问题

哲学家进餐问题

一张圆桌上有五位哲学家 每两位哲学家之间的桌子上摆着一根筷子,桌子中间是一碗米饭,五位哲学家都在用全部精力思考和吃饭
哲学家思考的时候,不会影响其他人,哲学家饥饿时,试图拿起左右两根筷子(一根一根拿起)如果筷子在其他人手上,则需要等待
哲学家只有左右手都拿起筷子 才可进餐,进餐完毕之后 放下筷子 继续思考


这个问题相当于是两个临界资源的使用
各个哲学家拿筷子这件事必须互斥地执行,这就保证了即使一个哲学家拿起筷子到一半的时候被阻塞(拿了一支)
也不会有其他哲学家继续尝试拿筷子,这样的话,当正在吃饭的哲学家放下筷子后,被阻塞的哲学家就可以获得等待的筷子。

semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;//互斥的取筷子
Pi(){
	//i号哲学家的进程
	while(1){
		P(mutex);
		P(chopstick[i]);//拿走左边
		P(chopstick[(i+1)%5]);//拿走右边
		V(mutex);
		吃饭
		V(chopstick[i]);//放回左边
		V(chopstick[(i+1)%5]);//放回右边
		思考
	}
}

上边这种算法可以有效避免循环等待 发生死锁的现象

这个问题的关键就在于解决进程死锁

以上就是哲学家进餐问题希望对大家有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值