其他分享
首页 > 其他分享> > 操作系统--哲学家进餐问题

操作系统--哲学家进餐问题

作者:互联网

简介

该问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上五只筷子,他们是交替的进行思考和进餐。一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考

哲学家进餐问题是诸进程间竞争临界资源而导致死锁的典型例子

image-20220803215042774


解决方式

方式一

创建为五个不同的线程代表五位不同的哲学家。每位哲学家先思考,当某位哲学家饥饿的时候,就拿起他左边的筷子,然后拿起他右边的筷子,然后进餐,然后放下他左右的筷子并进行思考。因为筷子是临界资源,所以当一位哲学家拿起他左右的筷子的时候,就会对他左右的筷子进行加锁,使其他的哲学家不能使用,当该哲学家进餐完毕后,放下了筷子,才对资源解锁,从而使其他的哲学家可以使用。

出现的问题:每个线程都等待其他线程释放资源从而被唤醒,从而每个线程陷入了无限等待的状态,即死锁。在哲学家就餐问题中,一种出现死锁的情况就是,假设一开始每位哲学家都拿起其左边的筷子,然后每位哲学家又都尝试去拿起其右边的筷子,这个时候由于每根筷子都已经被占用,因此每位哲学家都不能拿起其右边的筷子,只能等待筷子被其他哲学家释放。由此五个线程都等待被其他进程唤醒,因此就陷入了死锁

image-20220803215255753

方式二

同时只允许四位哲学家同时拿起同一边的筷子,这样就能保证一定会有一位哲学家能够拿起两根筷子完成进食并释放资源,供其他哲学家使用,避免了死锁。比如假定0~3号哲学家已经拿起了他左边的筷子,然后当4号哲学家企图去拿他左边的筷子的时候,将该哲学家的线程锁住,使其拿不到其左边的筷子,然后其左边的筷子就可以被3号哲学家拿到,然后3号哲学家进餐,释放筷子,然后其他的哲学家拿到筷子并进餐

方式三

规定奇数号哲学家先拿起他左边的筷子,然后再去拿他右边的筷子,而偶数号的哲学家则相反,这样的话总能保证一个哲学家能获得两根筷子完成进餐,从而释放其所占用的资源

方式四

仅当一个哲学家左右两支筷子都可用时才允许他拿起筷子。各哲学家拿筷子这件事必须互斥的执行。这就保证了既是一个哲学家在拿筷子拿到一半时被阻塞,也不会有别的哲学家会继续尝试拿筷子。这样的话,当前正在吃饭的哲学家放下筷子后,被阻塞的哲学家就可以获得等待的筷子了

image-20220803220933973

标签:进餐,哲学家,--,左边,死锁,线程,筷子,操作系统
来源: https://www.cnblogs.com/52-IT-y/p/16548947.html