【问题标题】:Distributed computing vs threads分布式计算与线程
【发布时间】:2009-05-02 23:25:32
【问题描述】:

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

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

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

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

《关于分布式计算的笔记》

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

(这是一个很明显的区别)

我确信事实介于两者之间。什么是金句?是否有任何技术可以统一这两种范式?还是因为网络和并发之间的根本差异,这种尝试失败了?

【问题讨论】:

    标签: multithreading language-agnostic networking theory


    【解决方案1】:

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

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

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

    我发现,一般来说,处理这种并行架构的人倾向于选择令人尴尬的并行问题来解决。想到了光线追踪。除了作业分配之外,不需要太多的跨节点通信。确实有很多这样的问题,但我觉得建议分布式计算本质上与线程相同有点虚伪。

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

    【讨论】:

      【解决方案2】:

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

      一般来说,您需要专门的库来解决分布式计算问题,从而弄清楚如何将节点分配给问题并围绕数据进行购物。

      我真的想知道他们是否会得出不同的结论,因为他们试图解决每个平台上的错误问题。有些问题非常适合高度互连的机器,并且可以从真正强大的超级计算机中受益。其他问题可以在简单的分布式模型上处理。一般来说,超级计算机可以解决更广泛的问题,但专业性和成本要高得多。

      【讨论】:

        【解决方案3】:

        区别似乎又回到了线程共享状态,进程传递消息。

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 网络透明度正是我正在寻找的术语。 “用于进程间通信的许多工具都是网络透明的”——有什么具体的例子吗?
          【解决方案5】:

          是的,在开发阶段,方法非常相似,但每种方法的使用方式却大不相同。我不太清楚你的想法,如果我错了,请告诉我:在谈论分布式计算时,我们假设在同一个应用程序中有不止一台计算机或服务器处理代码,但是当我们谈论多线程时,我们正在谈论在同一台计算机上同时处理应用程序的不同线程。 您可以将其视为分布式计算的一个示例,在一个应用程序中访问位于 Internet 中的 Web 服务。有两台不同的计算机在同一个应用程序中工作。

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

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

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-04-02
              • 1970-01-01
              • 1970-01-01
              • 2011-12-01
              • 2011-01-11
              • 2011-06-28
              • 1970-01-01
              • 1970-01-01
              • 2014-05-20
              相关资源
              最近更新 更多