57

线程和并行有什么区别?

哪一个比另一个有优势?

4

9 回答 9

59

Daniel Moth(我的前同事)- 线程/并发与并行文章解释了这一切。

引:

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

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

于 2009-04-30T11:42:07.890 回答
11

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

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

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

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

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

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

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

于 2009-04-30T12:03:15.500 回答
10

有两种不同的并发:

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

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

于 2019-11-22T08:47:18.070 回答
7

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

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

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

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

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

于 2009-04-30T12:29:20.617 回答
4

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

于 2009-04-30T11:49:44.517 回答
3

线程是穷人的并行。

编辑:更准确地说:

线程与并行性无关,反之亦然。线程是关于让一些进程并行运行的感觉。但是,这不会使流程总体上更快地完成所有操作。

于 2009-04-30T12:18:50.000 回答
3

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

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

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

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

来自Victor Eijkhout 在 Quora 上的回答

于 2017-05-16T06:56:29.657 回答
1

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

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

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

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

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

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

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

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

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

于 2018-09-09T05:59:50.117 回答