操作系统——哲学家进餐问题——2.12

盘一盘哲学家进餐问题

1.问题描述

五个哲学家,一块在切饭,每个哲学家之间,放了一根筷子,并且每次拿筷子的时候,只能从左边或者右边拿一根。只有同时拿了左右筷子之后才能切饭。
在这里插入图片描述

2.出现的问题&应用场景

问题:在并发的情况下,每个哲学家都拿起了左手边的筷子,就导致了每个哲学家都缺少右手边的筷子,就造成了死锁的情况。
场景:用于解决进程同时持有两个临界资源,干掉死锁的问题

3.解决方案

semaphore chopstick[5] = {1,1,1,1,1}; // 每个筷子的信号量
semaphore mutext = 1; // 互斥取得筷子
Pi(){
	while(1){
		P(mutext);
		P(chostick[i]); // 拿左边
		P(chostick[ (i+1) % 5]); // 拿右边
		V(mutex);
		吃饭
		V(chopstick[i]); // 放左
		V(chopstick[ (i+1) % 5]); // 放右
		发呆
	}
}

mutex信号量,用于每次只有一个哲学家在拿筷子。即使进程发生切换mutex也把其他哲学家给拦住。
在一个哲学家A恰饭的时候,即使另一个哲学家B可以拿筷子了,可是由于A把B需要用到的一只筷子给拿着了,chopstick这个信号量就把B给拦下来了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值