在第一集中,Cary为了测试Caspian在餐桌上提出了一个问题。

这是计算机科学中的一个经典问题——哲学家就餐问题。在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍尔重新表述为哲学家就餐问题。
问题可以描述为,有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,该哲学家进餐完毕后,放下左右两只筷子又继续思考。可以看出其中有以下约束条件:
1.只有拿到两只筷子时,哲学家才能吃饭。
2.如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子
3.任一哲学家在自己未拿到两只筷子吃完饭前,不会放下手中已经拿到的筷子。
如果不做任何规则限制, 每个哲学家都正好拿着左手的餐叉,永远都在等右边的餐叉,所有哲学家都会被饿死。那么应该如何设计这种机制呢?来看一下Caspian是如何解答这个问题的。

这种解法可以称为资源分级解法,把资源(筷子)每一个,工作单元(哲学家)总是先拿起左右两边编号较低的餐叉,再拿编号较高的。用完餐叉后,他总是先放下编号较高的餐叉,再放下编号较低的。在这种情况下,当四位哲学家同时拿起他们手边编号较低的餐叉时,只有编号最高的餐叉留在桌上,从而第五位哲学家就不能使用任何一只餐叉了。而且,只有一位哲学家能使用最高编号的餐叉,所以他能使用两只餐叉用餐。当他吃完后,他会先放下编号最高的餐叉,再放下编号较低的餐叉,从而让另一位哲学家拿起后边的这只开始吃东西。
其实现实场景中,会遇到更为复杂的情况。比如Caspian所描述的多个个程序需要访问多个数据数据库的场景,在《深入理解计算机系统》中给出了问题的解答“给所有的互斥操作的一个全序,如果每个线程都是以一种顺序获得互斥锁并以相反的顺序释放,那么这个程序就是无锁。”

上面的方案过于复杂容易引起漏洞。还有一种方法是服务生解法,有一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。这种方法的缺点在于引入了一个新角色,一旦服务生出现了问题,会导致整个系统陷入瘫痪。

其实最让我感兴趣的是Rene的回答,"拿根筷子喂给旁边的人吃嘛",但这种场景在现实生活中会发生吗?剧中的“上载人”和人类会在某种规则下和谐共处,进入到新纪元?还是共同走向毁灭?让我们在第二季中拭目以待。



万神殿 第一季相关影评