我想做以下几点:
我有很多电脑。在每台计算机上都会运行一个程序。没有集中式服务器。
该程序可以根据定义的标准选择提供另一台计算机指定的数据。在这样做时,另一台计算机不应该这样做。(一种双向同步)
我们来举个例子吧。(C1 ..Cn是在不同计算机上运行的程序)
C1发送C2更新的数据。当处理处于活动状态时,C2不应该要求C1更新其他内容。
他们的想法是:
C1向C2发送消息: PauseExecution() C1发送给要处理的C2项(更新C2上的一些数据) C1向C2: ResumeExecution()发送一条消息。C2向C1发送消息: PauseExecution() C2发送给要处理的C1项(更新C1上的一些数据) C2向C1: ResumeExecution()发送一条消息。但现在出现了最大的问题。
如果C1向C2发送消息以暂停,而C22以相同的时间发送消息给C1以暂停,则两者都将被阻塞。
没有中央服务器/共享内存来保存信号量。
是否有另一种模式可以使用,使n台计算机不会阻塞?
所以这个问题是关于算法排除。
或者,如果不能使用信号量或互斥量,是否还有其他解决方法解决这个问题?
发布于 2013-02-13 16:53:19
这里的关键字是分布式事务。用它攻击谷歌,你会发现很多可能的方法,但正如卡尔已经说过的,两阶段提交是传统的解决方案。
考虑到没有中央权威,在你从他们那里得到他们同意你的计划(第一阶段)之前,不考虑其他系统是有道理的。只有当所有涉及的系统都同意时,它们才会执行事务/数据发送/其他任何操作(第二阶段)。
但是,根据您拥有的传输量和所涉及的系统数量,您必须更仔细地查看可能发生的饥饿情况。假设系统A和B不断地希望向系统C发送数据,并且或多或少地用第一阶段提交来轰炸它,也就是说,它们询问系统C是否愿意接受它们的文件。如果您现在希望system向C发送一个文件,那么根据具体实现细节的公平性,它可能永远得不到确认。
发布于 2013-02-13 15:55:45
这方面有许多著名的算法。里卡特-阿格拉瓦拉的问题似乎最少。基本上,您不需要命令另一个系统暂停执行,而是暂停您自己的执行,发送请求,然后等待回复,然后再取消暂停。然后在执行关键部分之后发送另一条消息。不同的算法有不同的避免死锁的方法。
https://softwareengineering.stackexchange.com/questions/186980
复制相似问题