【问题标题】:Threading vs Parallelism, how do they differ?线程与并行,它们有何不同?
【发布时间】:2019-11-22 16:59:31
【问题描述】:

线程和并行有什么区别?

谁比谁更有优势?

【问题讨论】:

  • 汽车和驾驶有何不同?线程是使用线程的行为,并行是当某些东西并行运行时。使事情并行运行的最常见方法是使用线程。

标签: multithreading parallel-processing


【解决方案1】:

Daniel Moth (a former coworker of mine)- Threading/Concurrency vs Parallelism 文章说明了一切。

引用:

为了充分利用我们软件的多个内核,最终 必须使用线程。由于这个事实,一些开发人员陷入了困境 将多线程等同于并行的陷阱。那不是 准确...您可以在单核机器上进行多线程处理,但是 你只能在多核机器上进行并行处理

快速测试:如果您在单核机器上使用线程并且它对您的场景非常有意义,那么您不是在“做并行”,您只是在做多线程。

【讨论】:

  • 好文章!可能值得在此处添加简短摘要或引用,以防止链接失效。
  • @ChrisNolet web.archive.org 有利于链接腐烂。不过,由于其他原因,引用和摘要仍然很好。
【解决方案2】:

有两种不同的并发:

  1. 线程:CPU 在不同线程之间切换非常快,给人一种并发的假象。关键点:在任何给定时间只有一个线程在运行。当一个线程在运行时,其他线程会被阻塞。你可能会想,这比程序运行有什么用?好吧,把它想象成一个优先队列。可以安排线程。 CPU调度器可以给每个线程一定的运行时间,暂停它们,将数据传递给其他线程,然后给它们不同的优先级以在以后运行。对于相互交互的非即时运行进程来说,这是必须的。它广泛用于服务器:数以千计的客户端可以同时请求某些内容,然后在稍后获取他们请求的内容(如果按程序完成,一次只能为一个客户端提供服务)。 理念:一起做不同的事情。它不会减少总时间(服务器的争议点,因为一个客户端不关心其他客户端的总请求)。
  2. Parallelism:线程并行运行,通常在不同的CPU核心,真正的并发。关键点:多个线程在任何给定时间运行。这对于繁重的计算、超长时间运行的进程很有用。一组单核机器也是如此,将数据分成多个部分供每台机器进行计算,最后将它们汇集在一起​​。不同的机器/内核很难相互交互。 理念:用更少的时间做一件事。

如您所见,它们解决了完全不同类型的问题。

【讨论】:

    【解决方案3】:

    线程通常是指让多个进程在单个 CPU 上同时工作(实际上您认为它们不会,但它们之间的切换速度非常快)。

    并行性是指多个进程同时在多个 CPU 上工作。

    两者都有其优缺点,很大程度上取决于您的操作系统使用的调度程序。通常,创建线程的计算成本比在另一个 CPU 上生成进程要低得多,但是为自己拥有一个“完整”的 CPU 会提高该进程的整体速度。但话又说回来,如果该进程需要与另一个 CPU 上的另一个进程通信,则您需要解决 IPC(进程间通信)问题,这可能是一种开销,因此在同一个 CPU 上使用一个线程实际上会更好。

    大多数操作系统都知道多个 CPU/内核并且可以使用它们,但这使得调度程序通常非常复杂。

    如果您正在使用使用 VM(虚拟机)的语言进行编程,请注意他们需要实现自己的调度程序(如果有的话)。 例如,Python 使用 GIL,它几乎表示在该 VM 上运行的所有内容始终保持在同一个 CPU 上。尽管某些操作系统能够将繁重的进程迁移到另一个目前不那么忙的 CPU,这当然意味着在执行此操作时需要暂停整个进程。

    像 DragonFlyBSD 这样的一些操作系统采用完全不同的方法来调度,而不是目前的“标准”方法。

    我认为这个答案为您提供了足够的关键字来搜索更多信息:-)

    【讨论】:

      【解决方案4】:

      并行是一种使用多个指令流来完成计算的通用技术。所有并行技术的关键方面是在流之间进行通信以协作最终答案。

      线程是并行的特定实现。每个指令流都有自己的堆栈来记录局部变量和函数调用,并通过共享内存与其他流隐式通信。

      一个例子可能是让一个线程简单地将磁盘请求排队并将其传递给工作线程,从而有效地并行化磁盘和 CPU。传统的 UNIX 管道方法是将它们拆分为两个完整的程序,在命令中说“cat”和 grep:

      cat /var/log/Xorg.0.log | grep "EE"
      

      可以想象,线程可以降低将磁盘 I/O 从 cat 进程复制到 grep 进程的通信成本。

      【讨论】:

        【解决方案5】:

        线程是一种技术,并行是一种可以使用线程实现的范例(但也可以很容易地在多个处理器上使用单个线程来实现)

        【讨论】:

          【解决方案6】:

          线程是穷人的并行。

          编辑:更准确地说:

          线程与并行无关,反之亦然。线程是关于让一些进程并行运行的感觉。但是,这并没有使进程总体上完成所有他们的动作更快。

          【讨论】:

          • (-1) A. 每个工具都有它的位置。 B. 你有什么可以支持的吗?
          • 我刚刚回答了主题问题。问题是什么 - 答案也是。
          • 对于那些想要扩展讨论的人 - 让我们从prodata.lt/EN/Programming/OPU_computing_model.pdf开始。
          • 我删除了我的减号,因为您澄清了您的回复。
          • 但是,线程确实可以让您的执行更快地完成,具体取决于您的应用程序一些实例:一个下载程序一次下载多个文件,如果我对应用程序进行多线程处理,它将更快地下载所有文件,但个别文件较慢。进行持续计算并偶尔有用户输入的应用程序。如果你把它放在一个线程上,你的后台计算将停止(因为如果它们在同一个线程上,它们实际上并不在后台)。但我同意并行和线程并不相同。
          【解决方案7】:

          这是消除任何人对并行性和线程相关的疑虑的最佳答案。

          线程是一种软件结构。即使在旧的单核处理器上,我也可以启动任意数量的 pthread。所以多线程不一定是并行的:只有硬件可以支持它才是并行的。因此,如果您有多个内核和/或超线程,您的多线程将变为并行。而如今,事实上大部分时间都是这样。

          并发是关于没有明确时间顺序的活动。同样,如果硬件支持,它们可以并行完成,如果不支持,则不。

          因此,传统上多线程几乎是并发的同义词。并且它们只有在硬件支持的情况下才会并行。即便如此,您也可以启动比硬件支持更多的线程,并且剩下的就是并发。

          来自an answer by Victor Eijkhout on Quora

          【讨论】:

            【解决方案8】:

            您如何定义“并行性”?多线程是并行程序执行概念的具体实现。

            RichardOD 链接的文章似乎主要关注线程是否实际上在具体机器上并行执行。

            但是,您的问题似乎将多线程和并行性视为对立面。您可能是指使用多个进程而不是多个线程的程序?如果是这样,区别是:

            • 创建线程比创建进程便宜得多。这就是为什么在 Web 应用程序中使用线程而不是进程会导致巨大的加速 - 这就是所谓的“FastCGI”。
            • 同一台机器上的多个线程可以访问共享内存。这使得线程之间的通信变得更加容易,但也非常危险(很容易产生难以诊断和修复的竞态条件等错误)。

            【讨论】:

              【解决方案9】:

              如果我们认为CPU 是一个公司,线程是它的工人,那么它有助于我们更容易地理解线程和并行性。

              就像一个公司有很多工人一样,CPU 也有很多线程。

              还可能有不止一家公司,因此可能有不止一个 CPU。

              因此,当工人(线程)在公司(CPU)中工作时,它被称为线程

              当两个或多个公司(CPU)独立或共同工作时,称为并行

              【讨论】:

                猜你喜欢
                • 2015-04-11
                • 2015-09-15
                • 2015-06-06
                • 1970-01-01
                • 2018-10-24
                • 2010-12-21
                • 1970-01-01
                • 1970-01-01
                • 2012-04-25
                相关资源
                最近更新 更多