分布式计算和线程有多相似?我发现有两篇论文得出了相反的结论:

“多线程比网络更容易。线程如何简单且类似于网络代码“

http://software.intel.com/file/14723

(这给我的印象是它们非常相似,在封装后这两种方法可以使用相同的代码完成 - 但也许我错了)

“关于分布式计算的说明”

http://research.sun.com/techrep/1994/abstract -29.html

(这有很大的区别)

我确信事实介于两者之间。什么是中庸之道?有没有技术可以统一这两种范式?或者由于网络和并发之间的根本区别而导致此类尝试失败?

有帮助吗?

解决方案

我从未发现它们非常相似。让我为这篇文章的目的定义一个“节点”。是一台机器上运行的硬件线程。因此四核机器是四个节点,就像一个由四个单处理器盒组成的集群。

每个节点通常都会运行一些处理,并且需要某种类型的跨节点通信。通常,此通信的第一个实例是告诉节点要做什么。对于这种通信,我可以使用共享内存,信号量,共享文件,命名管道,套接字,远程过程调用,分布式COM等。但最简单的使用,共享内存和信号量通常不能通过网络使用。共享文件可能可用,但性能通常很差。套接字往往是网络上最常见,最灵活的选择,而不是更复杂的机制。此时,您必须处理网络架构的详细信息,包括延迟,带宽,数据包丢失,网络拓扑等。

如果从一个工作队列开始,同一台机器上的节点可以使用简单的共享内存来完成工作。你甚至可以把它写成无锁,它可以无缝地工作。通过网络上的节点,您在哪里放置队列?如果集中它,该机器可能会承受非常高的带宽成本。尝试分发它,事情变得非常复杂。

我发现,一般来说,处理这种并行体系结构的人倾向于选择令人尴尬的并行问题来解决。想到了光线追踪。除了工作分配之外,不需要太多的跨节点通信。当然,有很多这样的问题,但我觉得分布式计算与线程化基本相同有点不诚实。

现在,如果您要编写与分布式系统完全相同的线程,使用纯消息传递并且不假设任何线程是“主”。一个,然后是的,他们会非常相似。但是你所做的就是假装你有一个分布式架构并在线程中实现它。问题在于线程化是一种比真正的分布式计算更简单的并行性案例。您可以将这两个问题抽象为一个问题,但是选择更难的版本并严格遵守它。当所有节点都是机器的本地节点时,结果将不会像它们那样好。你没有利用特殊情况。

其他提示

分发计算是在多个不同的独立机器上完成的,通常有时是专门的操作系统。它更难,因为机器的互连性要低得多,因此很难解决需要大量快速随机访问整个数据集的问题。

一般来说,您需要专门的库来执行分布式计算问题,这些问题可以解决如何将节点分配给问题并推送数据。

我真的很想知道他们是否会得出不同的结论,因为他们正在努力解决每个平台上的错误问题。有些问题非常适合高度互联的机器,并且可以从真正的超级计算机中受益。其他问题可以通过简单的分布式模型来处理。一般来说,超级计算机可以解决更广泛的问题,但是更加专业化和昂贵。

差异似乎回到了Threads共享状态,Processes传递消息。

在选择应用之前,您需要决定如何在应用中维护状态。

共享状态很容易上手,所有数据和变量都在那里。但是一旦死锁/竞争条件进入,很难修改/扩展。

消息传递(例如Erlang)需要采用不同的设计方法,您必须从一开始就考虑并发机会,但每个分布式流程的状态都是孤立的,这使得锁定/竞争问题更易于处理。

我认为将流程与分布式计算方法进行比较比将线程与线程进行比较要有用得多。线程存在于单个进程内,并共享相同的数据和相同的内存。这在几台机器上是不可能的。另一方面,进程有自己的内存,虽然它在某些情况下包含与另一个进程完全相同的数据(例如在fork()之后)。这可以通过网络实现。

为此类比增加额外重量的事实是,用于进程间通信的许多工具是网络透明的。一个很好的例子是unix套接字,它使用与网络套接字相同的接口(连接代码除外)。

是的,在开发时间方法非常相似,但每种方法的使用都非常不同。我不明白你的想法,让我知道我是不是错了:在谈论分布式计算时,我们假设在同一个应用程序中有多个计算机或服务器处理代码,但当我们谈论多线程时正在谈论在同一台计算机上同时处理应用程序的不同线程。 您可以在一个访问位于Internet中的Web服务的应用程序中将分布式计算视为一个示例。有两台不同的计算机在同一个应用程序中工作。

如果你想要一个多线程的例子,只要想想一个试图找到一个大素数的应用程序。如果您不使用多线程,则在计算下一个素数(可能是终身或更长时间)时,您将无法在应用程序中查看或执行任何其他操作,因为应用程序是在计算中工作时没有响应。

您也可以混合它们:作为一个更复杂的示例,您可以使用多线程同时通过同一个应用程序访问不同的Web服务,这是为了使您的应用程序即使没有连接也能响应当其中一个服务器。

我认为这两个文件不容易比较。英特尔的文档是对线程的一种介绍,他们试图通过找到网络计算的类比来解释它,这对我来说有点奇怪和误导。我不确定他们为什么选择这样一种呈现线程的方式,也许他们针对熟悉网络的人,这可能比线程更为人所知或至少被认可。

另一方面,Sun的文档是一篇严肃的文章,描述了与分布式编程相关的所有困难。我所能做的就是简单地确认他们在其中所说的内容。

在我看来,试图隐藏对象远程事实的抽象是有害的,因为它通常会导致非常糟糕的性能。程序员必须知道对象的远程性能够以有效的方式调用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top