今天学习了操做系统的哲学家就餐问题,对此我写一下我的理解和分析。这是第一次写,可能不会太好,有问题希望大家帮忙指正。
问题描述:
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
问题分析:它是进程需要多个临界资源才能正常运行。该临界资源相对于进程是“左右”两边的,只有同时拿到“左右”两边的进程才能进行“吃饭”操作。
第1步:关系分析。考虑是否有同步(一前一后)或互斥(同时刻只能一个一个进程访问),问题中明显没有同步进程。访问左右筷子时候,拿筷子需要互斥。
第2步:整理思路。该进程必须要同时访问左右两个资源才能吃饭。若同时访问左,所有哲学家左手拿完筷子,然后他们想要再拿右手筷子时候,桌子上没有筷子,需要等他们能拿到右手筷子吃饭完成才能放下筷子。但是哲学家们不会放下筷子,进程就会一直运行下去,就会产生死锁,如何避免死锁。
第3步:设置信号量。看进程是先申请还是先释放临界资源(筷子),题中肯定是先拿筷子,就是先申请,故此就是设为1。即 chopstick [5] ={ 1,1,1,1,1};。
问题解决:
方法1:就是当至少有一个哲学家吃饭,他吃完饭后放下筷子就能让其他哲学家们使用。
方法2:考虑一个优先队列,序号为奇数的哲学家先吃饭或者偶数序列的哲学家先吃饭。
方法3:若要哲学家能全部吃饭,就是哲学家拿左右筷子是“一气呵成”(左右手拿筷子不受其他其他哲学家的影响)才能实现全部能吃饭。即设置一个 mutex=1 的信号量机制(记录型信号量),保证左右手拿筷子不受其他的影响。
注:i 表示第 i 个哲学家。
执行顺序:0,1,2。0号执行P(mutext)时候,此时若1,2进入执行P(mutext)时候,mutext=0他们就会进入休眠,然后会拿起左右筷子,等到0执行V(mutext)。 1,2才会执行。
其他顺序也是同理分析,这样就能解决哲学家就餐问题了。