目录

​哲学家进餐问题​

​问题的提出​

​初步思考​

​进程资源共享关系和同步关系分析​

​问题的具体解决方案​

​第一搏​

​存在的问题?​

​第二搏​


哲学家进餐问题

问题的提出

  • 5位哲学家围绕圆桌而坐,反复思考和进餐;
  • 但是只有5只碗和筷子,放置如图所示,只有当哲学家同时拿起碗边的2只筷子时,才能进餐;
  • 请用记录型信号量进行同步。

操作系统_哲学家进餐问题_死锁

 

初步思考

1,考虑到程序的顺序执行,哲学家先拿起一根筷子,再拿起另一根筷子;

2,有一定的顺序性,比如特定位置的哲学家必须对应特定位置的筷子;

3,最多同时有两个哲学家同时进餐;

进程资源共享关系和同步关系分析

1,思考:

  • 几个进程?:5种哲学家进程(由于哲学家有特定的位置,所以每个进程需要特别标明);
  • 共享什么样的资源?:相邻的两位哲学家互斥地访问他们之间的筷子,所以有5个临界资源——特定位置的筷子;

问题的具体解决方案

第一搏

由于不同的哲学家进程只有编号不一样,所以,使用一个模板(每个进程都不同

操作系统_哲学家进餐问题_哲学家进餐问题_02

,只是内容基本一致);

操作系统_哲学家进餐问题_哲学家进餐问题_03

实现了哲学家拿起筷子的顺序(先右手后左手),并且每个哲学家i对应特定的筷子;

存在的问题?

当5位哲学家同时进餐(5个进程并发,每当一位哲学家拿起右手的筷子,就发生进程切换),将会出现下图情形:

操作系统_哲学家进餐问题_死锁_04

                    

操作系统_哲学家进餐问题_解决方案_05

这样每位哲学家都拿不到左手边的筷子,都进阻塞锁状态,于是形成了死锁。

第二搏

将最后一位哲学家拿筷子的顺序颠倒。

操作系统_哲学家进餐问题_哲学家进餐问题_06

解释如何解决死锁:

操作系统_哲学家进餐问题_哲学家进餐问题_07

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,因此必定有一位哲学家先得到筷子;
  • 最终得到筷子的哲学家进餐完毕后,便会释放左右手的筷子,另一个进餐便可以拿到想要的资源,以此类推,不会出现死锁;

这便是哲学家进餐问题的标准解答之一!