目录
问题的提出
初步思考
第一搏
存在的问题?
第二搏
哲学家进餐问题
问题的提出
- 5位哲学家围绕圆桌而坐,反复思考和进餐;
- 但是只有5只碗和筷子,放置如图所示,只有当哲学家同时拿起碗边的2只筷子时,才能进餐;
- 请用记录型信号量进行同步。
初步思考
1,考虑到程序的顺序执行,哲学家先拿起一根筷子,再拿起另一根筷子;
2,有一定的顺序性,比如特定位置的哲学家必须对应特定位置的筷子;
3,最多同时有两个哲学家同时进餐;
进程资源共享关系和同步关系分析
1,思考:
- 几个进程?:5种哲学家进程(由于哲学家有特定的位置,所以每个进程需要特别标明);
- 共享什么样的资源?:相邻的两位哲学家互斥地访问他们之间的筷子,所以有5个临界资源——特定位置的筷子;
问题的具体解决方案
第一搏
由于不同的哲学家进程只有编号不一样,所以,使用一个模板(每个进程都不同
,只是内容基本一致);
实现了哲学家拿起筷子的顺序(先右手后左手),并且每个哲学家i对应特定的筷子;
存在的问题?
当5位哲学家同时进餐(5个进程并发,每当一位哲学家拿起右手的筷子,就发生进程切换),将会出现下图情形:
这样每位哲学家都拿不到左手边的筷子,都进阻塞锁状态,于是形成了死锁。
第二搏
将最后一位哲学家拿筷子的顺序颠倒。
解释如何解决死锁:
1,哲学家进程0-4依次执行:
- 当0-3号哲学家进程依次拿起了右手边的筷子,轮到哲学家进程4;
- 由于哲学家4先拿左手边的筷子0,发现哲学家1已经占有了这根筷子,于是发生阻塞;
- 这时0-2号哲学家拿到执行权时,都会由于左手边的筷子被占用,从而陷入阻塞状态;
- 只剩哲学家3,由于哲学家4先拿左手边的筷子0被阻塞,于是右手边的筷子4是空闲的,正好哲学家3需要占有这个资源;
- 哲学家3使用完筷子后,哲学家2便可获得筷子3的使用权,以此类推,不会出现死锁;
2,哲学家进程0-4乱序执行:
不失一般性,假定进程切换(拿到一根筷子后切换)的顺序为1、4、2、3、0
- 哲学家1拿起右手边的筷子1,哲学家4拿起左手边的筷子0,哲学家2拿起右手边的筷子2,哲学家3拿起右手边的筷子3;
- 哲学家0想要拿起右手边的筷子0,然而哲学家4已经占有了筷子0,哲学家0陷入沉思(阻塞);
- 哲学家1缺筷子2,哲学家2缺筷子3,所以当轮到哲学家2、3执行时,便会陷入阻塞;
- 由于轮到哲学家0、1、2执行时,他们均会陷入阻塞;
- 此时只有哲学家3和哲学家4同时竞争筷子4,因此必定有一位哲学家先得到筷子;
- 最终得到筷子的哲学家进餐完毕后,便会释放左右手的筷子,另一个进餐便可以拿到想要的资源,以此类推,不会出现死锁;
这便是哲学家进餐问题的标准解答之一!