【发布时间】:2014-04-11 01:01:06
【问题描述】:
生产者/消费者和读者/作家很容易想到,但餐饮哲学家呢? N个进程和N个资源在什么样的情况下会在环形拓扑上相互交错?我可以想到 N 个进程竞争 M 个资源,但在这种情况下,每个进程都可以使用任意两个资源。
wiki 说 Dijkstra 用它来模拟竞争磁带驱动器外围设备的计算机。这种情况在现代还存在吗?
【问题讨论】:
标签: concurrency synchronization dining-philosopher
生产者/消费者和读者/作家很容易想到,但餐饮哲学家呢? N个进程和N个资源在什么样的情况下会在环形拓扑上相互交错?我可以想到 N 个进程竞争 M 个资源,但在这种情况下,每个进程都可以使用任意两个资源。
wiki 说 Dijkstra 用它来模拟竞争磁带驱动器外围设备的计算机。这种情况在现代还存在吗?
【问题讨论】:
标签: concurrency synchronization dining-philosopher
我发现在两个账户之间执行交易的问题与哲学家就餐问题非常相似。要执行交易,线程必须锁定两个帐户,以确保从一个帐户中借记正确的值(首先确保有可用资金)并记入另一个帐户。
拓扑不完全是圆桌,但非常接近。想象一下桌上有 5 个帐户。在这个类比中,账户就是叉子。任何两个账户都可以参与交易。交易==哲学家。所以在这个例子中,交易(哲学家)不仅可以位于两个账户(分叉)之间的表格边缘,还可以位于横跨表格的一条线上,连接任意两个账户(分叉)。
【讨论】:
哲学家就餐和其他类似“问题”的主要目的不是描述现实世界的场景,而是为流程交互提供一个清晰、抽象、甚至简化的规范,一方面可以用作教学示例,而且另一方面,为真正的软件构建模块。
具体来说,哲学家进餐是一个很好的例子,展示了活锁和死锁是如何发生的。
至于现实世界的场景,我不知道磁带驱动器,但我可以想象一个火箭引导系统,其中火箭机翼是“叉子”,而“哲学家”是控制成对机翼以引导航向的过程火箭。您甚至不必对通常的插图进行太多修改即可切换到此说明:)
【讨论】: