哲学家进餐问题
一、问题背景及分析
(一)基本分析及实现
每个进程争抢地使用一种资源,其中若分配不当会导致死锁现象。
基本实现:
(二)避免死锁发生的三种方法(仍有很多种,这里仅作列举参考)
(1)限制资源容量
可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家可以拿到左右两只筷子。
这里代码实现可将资源数量设置为4。
(2)以奇偶特征分开
要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这避免了占有一支后再等待另一只的情况。
(3)仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子
详细见 二、
二、问题实现
三、问题思考
(注:对上面的实现的思考)
理解:情景:A 先吃饭
- 若另一个相邻的哲学家 B 在 A 仍在 mutex 的 P、V 操作时也想来吃饭,则会因 P 操作阻塞。
- 若另一个相邻的哲学家 B 在 A 吃饭时(A 已释放了 mutex 资源)也想来吃饭,则会因其中一个拿起筷子操作阻塞。
- 在 2. 的基础上若还有哲学家 C 也想吃饭,则会在 P(mutex) 阻塞(B在占用并处于阻塞状态)
- 即 3. 的问题可能导致:明明 C 不在 A 隔壁,且两边都有筷子,却因 P(mutex) 阻塞 (被其他人占用且处于阻塞)而吃不到饭
- 同时会带来效率低下等其他问题