首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络模式下的互斥?

网络模式下的互斥?
EN

Software Engineering用户
提问于 2013-02-13 15:42:03
回答 2查看 1.4K关注 0票数 1

我想做以下几点:

我有很多电脑。在每台计算机上都会运行一个程序。没有集中式服务器。

该程序可以根据定义的标准选择提供另一台计算机指定的数据。在这样做时,另一台计算机不应该这样做。(一种双向同步)

我们来举个例子吧。(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台计算机不会阻塞?

所以这个问题是关于算法排除。

或者,如果不能使用信号量或互斥量,是否还有其他解决方法解决这个问题?

EN

回答 2

Software Engineering用户

发布于 2013-02-13 16:53:19

这里的关键字是分布式事务。用它攻击谷歌,你会发现很多可能的方法,但正如卡尔已经说过的,两阶段提交是传统的解决方案。

考虑到没有中央权威,在你从他们那里得到他们同意你的计划(第一阶段)之前,不考虑其他系统是有道理的。只有当所有涉及的系统都同意时,它们才会执行事务/数据发送/其他任何操作(第二阶段)。

但是,根据您拥有的传输量和所涉及的系统数量,您必须更仔细地查看可能发生的饥饿情况。假设系统A和B不断地希望向系统C发送数据,并且或多或少地用第一阶段提交来轰炸它,也就是说,它们询问系统C是否愿意接受它们的文件。如果您现在希望system向C发送一个文件,那么根据具体实现细节的公平性,它可能永远得不到确认。

票数 3
EN

Software Engineering用户

发布于 2013-02-13 15:55:45

这方面有许多著名的算法。里卡特-阿格拉瓦拉的问题似乎最少。基本上,您不需要命令另一个系统暂停执行,而是暂停您自己的执行,发送请求,然后等待回复,然后再取消暂停。然后在执行关键部分之后发送另一条消息。不同的算法有不同的避免死锁的方法。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/186980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档