著名的“哲学家就餐问题”是指:5位哲学家围圆桌就座,桌上每两人之间放一根筷子,任一哲学家修学中饿了便能且只能拿起左右两边的筷子吃饭,餐后将两根筷子各放回原处,自己继续做学问,如此往复,即对哲学家Pi(i=0,1,2,3,4)有循环进程Si
    Pi做学问;
    Pi取左手的第i号筷子;
    Pi取右手的第(i+1) mod 5号筷子;
    Pi就餐;
    Pi将两根筷子分别放回原处。
    哲学家就餐问题是由这样5个进程组成的系统。
问答题     请说明此系统是个会死锁的系统。
 
【正确答案】当5位哲学家同时饿了,同时取得左手的筷子并占有这一资源后,再同时申请右手的筷子,发现已无可用资源,此时5位哲学家都不会主动释放手中的资源,又都在等待他人手中的筷子,因此发生死锁。
【答案解析】
问答题     请分别用死锁预防、死锁避免、死锁检测与恢复来改造系统。
 
【正确答案】可以采用不同的方法改造系统。 死锁预防: ①破坏占有等待条件:每位哲学家拿筷子时必须左、右筷子同时申请,即采用资源一次性分配法,若缺一则不可获得资源分配。 ②破坏非剥夺条件:第i位哲学家拿筷子时,若左、右邻居中有等待资源者,则可强行抢夺其已经占有的筷子。 ③破坏循环等待:对5根筷子顺序编号,即0,1,2,3,4,每位哲学家只能按由小到大的顺序申请(资源顺序分配法)。 死锁避免:每位哲学家申请筷子时,先看分配后是否会发生死锁,若不会则分配,否则拒绝分配。例如最易发生死锁的情况:已有4位拿到左手的筷子,此时第5位申请左手的筷子,则不可分配。 死锁检测与恢复:对筷子的申请和分配不加限制,但定期(例如每隔5s)检测是否已发生死锁,是则剥夺其中一位哲学家的筷子分配给其他人。
【答案解析】
问答题     将上述情况之一编写程序实现。
 
【正确答案】在哲学家进程中实现资源顺序分配法。 将5根筷子按照逆时针方向编号为0,1,2,3,4;定义信号量组chopstick[5]分别表示着5个资源,初值均为1。假设这虚假的编号与其左边的筷子编号相同,按照资源顺序分配法,哲学家P0~P3都是先从左手取,再从右手取;只有P4是先取右手的,再取左手的。 P0~P3:P(chopstick[i]); P(chopstick[i+1]); 吃饭; V(chopstick[i]); V(chopstick[i+1]); P4:P(chopstick[0]); P(chopstick[4]); 吃饭; V(chopstick[0]); V(chopstick[4]);
【答案解析】 在本题中,互斥占用条件是无法破坏的。死锁避免就是采用保守的、安全的资源分配方法,如银行家算法。死锁检测与恢复允许系统发生死锁,但定期检测,若已发生死锁,则采取适当措施恢复死锁,如剥夺其中一进程的资源分配给其他进程。