线程和并行有什么区别?
哪一个比另一个有优势?
Daniel Moth(我的前同事)- 线程/并发与并行文章解释了这一切。
引:
为了利用我们软件的多个内核,最终必须使用线程。由于这个事实,一些开发人员陷入了将多线程等同于并行的陷阱。那不准确...您可以在单核机器上进行多线程处理,但您只能在多核机器上进行并行处理
快速测试:如果您在单核机器上使用线程并且它对您的场景非常有意义,那么您不是在“做并行”,您只是在做多线程。
线程通常是指在单个 CPU 上同时工作的多个进程(实际上,您认为它们不会,但它们之间的切换速度非常快)。
并行性是让多个进程同时在多个 CPU 上工作。
两者都有其优缺点,很大程度上取决于您的操作系统使用的调度程序。通常,创建线程的计算成本比在另一个 CPU 上生成进程要低得多,但是为自己拥有一个“完整”的 CPU 会提高该进程的整体速度。但话又说回来,如果该进程需要与另一个 CPU 上的另一个进程通信,您需要解决 IPC(进程间通信)问题,这可能是一种开销,因此在同一个 CPU 上使用线程实际上更好。
大多数操作系统都知道多个 CPU/Cores 并且可以使用它们,但这使得调度程序通常非常复杂。
如果您正在使用使用 VM(虚拟机)的语言进行编程,请注意他们需要实现自己的调度程序(如果有的话)。例如,Python 使用 GIL,它几乎表明在该 VM 上运行的所有内容始终保持在同一个 CPU 上。尽管某些操作系统能够将繁重的进程迁移到另一个目前不那么忙的 CPU,但这当然意味着在执行此操作时需要暂停整个进程。
像 DragonFlyBSD 这样的一些操作系统采用完全不同的方法来调度,然后是目前的“标准”方法。
我认为这个答案为您提供了足够的关键字来搜索更多信息:-)
有两种不同的并发:
如您所见,它们解决了完全不同类型的问题。
并行是一种使用多个指令流来完成计算的通用技术。所有并行技术的关键方面是在流之间进行通信以协作最终答案。
线程是并行性的具体实现。每个指令流都有自己的堆栈来记录局部变量和函数调用,并通过共享内存与其他流进行隐式通信。
一个例子可能是让一个线程简单地将磁盘请求排队并将其传递给工作线程,从而有效地并行化磁盘和 CPU。传统的 UNIX 管道方法是将它们拆分为两个完整的程序,在命令中说“cat”和 grep:
cat /var/log/Xorg.0.log | grep "EE"
可以想象,线程可以降低将磁盘 I/O 从 cat 进程复制到 grep 进程的通信成本。
线程是一种技术,并行性是一种可以使用线程实现的范例(但也可以很容易地在多个处理器上使用单个线程来完成)
线程是穷人的并行。
编辑:更准确地说:
线程与并行性无关,反之亦然。线程是关于让一些进程并行运行的感觉。但是,这不会使流程总体上更快地完成所有操作。
这是消除任何人对并行性和线程相关的疑虑的最佳答案。
线程是一种软件结构。即使在旧的单核处理器上,我也可以启动任意数量的 pthread。所以多线程不一定是并行的:只有硬件可以支持它才是并行的。因此,如果您有多个内核和/或超线程,您的多线程将变为并行。而这些天实际上是大部分时间。
并发是关于没有明确时间顺序的活动。同样,如果硬件支持,它们可以并行完成,如果不支持,则不支持。
因此,传统上多线程几乎是并发的同义词。并且它们只有在硬件支持的情况下才会并行。即使这样,您也可以启动比硬件支持更多的线程,并且您还剩下并发性。
你如何定义“并行”?多线程是并行程序执行概念的具体实现。
链接到的文章 RichardOD 似乎主要关注线程是否实际在具体机器上并行执行。
但是,您的问题似乎将多线程和并行性视为对立面。您可能是指使用多个进程而不是多个线程的程序吗?如果是这样,差异是:
如果我们把CPU 看作一个公司,把线程看作它的工人,那么它有助于我们更容易地理解线程和并行性。
就像一个公司有很多工人一样,CPU 也有很多线程。
也可能有不止一家公司,因此可能有不止一个 CPU。
因此,当工人(线程)在公司(CPU)中工作时,它被称为线程。
当两个或多个公司(CPU)独立或一起工作时,称为并行。