线程与并行,它们有何不同?

69

线程和并行的区别是什么?

哪一个比另一个更具优势?


10
汽车与驾驶有何不同?Threading 是使用线程的行为,parallelism 是当某些东西并行运行时。使事物并行运行的最常见方法是使用线程。 - jalf
9个回答

68

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

引用:

要充分利用我们软件中的多个核心,最终必须使用线程。由于这个事实,一些开发人员陷入将多线程等同于并行处理的误区。那是不准确的...您可以在单核计算机上使用多线程,但只有在多核计算机上才能进行并行处理。

快速测试:如果在单核计算机上使用线程并且这对于您的情况非常合理,则您并没有“进行并行处理”,而只是进行了多线程处理。


13
好文章!或许值得在这里添加一个简短的摘要或引用,来防止链接失效。 - Chris Nolet
@ChrisNolet http://web.archive.org/ 对于链接失效很有用。但是引用和摘要出于其他原因仍然很好。 - ADJenks

26

并发有两种不同的类型:

  1. 线程:CPU 快速切换不同的线程,给人一种并发的假象。关键点是: 任何时候只有一个线程在运行。 当一个线程在运行时,其他线程被阻塞。你可能会想,这和顺序执行有什么区别?嗯,可以将它看作是一个优先队列。线程可以被调度。CPU 调度程序可以给每个线程一定的时间来运行、暂停它们、向其他线程传递数据,然后给它们不同的优先级以便于在以后的某个时间运行。它是必须的,特别是对于相互交互的非即时运行进程。它广泛应用于服务器:成千上万的客户端可以同时请求某些内容,然后在稍后的时间得到他们所请求的内容(如果按顺序进行,则一次只能为一个客户端提供服务)。哲学:一起做不同的事情。 它不会减少总时间(对于服务器来说无意义,因为一个客户端不关心其他客户端的总请求数)。
  2. 并行计算:线程同时运行,通常在不同的CPU核心上,实现真正的并发。要点:多个线程在任何给定时间都在运行。它对于需要进行大量计算、超长时间运行的进程非常有用。对于单核机器群组来说也是同样的道理,将数据分成部分,让每台机器进行计算,最后将结果汇总。不同的机器/核心之间很难互相交互。哲学:在更短的时间内做好一件事情。

15

多线程通常指在单个CPU上同时运行多个进程(实际上并不是每个进程都在同时运行,而是在它们之间快速切换)。

并发是指在多个CPU上同时运行多个进程。

两者各有优缺点,严重取决于操作系统所使用的调度程序。通常创建线程的计算成本比在另一个CPU上生成进程低得多,但如果需要与另一个CPU上的其他进程通信,则需要解决进程间通信(IPC)问题,这可能会带来过多的开销,导致使用同一CPU上的线程实际上更好。

大多数操作系统都可以识别多个CPU / Core,并可以使用它们,但这使得调度程序通常相当复杂。

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

一些操作系统(如DragonFlyBSD)采用完全不同的调度方法,而不是当前的“标准”方法。

我认为这个答案给了足够的关键词让您搜索更多信息 :-)


8

并行性是一种通用的技术,利用多个指令流来完成计算。所有并行技术的关键在于在流之间进行通信以协同生成最终答案。

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

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

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

线程技术可以潜在地降低将磁盘I/O从cat进程复制到grep进程的通信成本。


6

Threading是一种技术,而Parallelism则是一种范式,可以使用线程来实现(但也可以在多个处理器上使用单个线程轻松完成)。


4

这里是解决任何与并行和线程相关疑惑的最佳答案。

线程是一种软件构造。我可以启动尽可能多的pthread,即使在旧的单核处理器上也可以。因此,多线程不一定是并行的:只有硬件支持它才是并行的。因此,如果您拥有多个核心和/或超线程,则多线程变成并行。而现在大多数情况下确实如此。

并发性涉及没有明确时间顺序的活动。因此,如果硬件支持它们,则可以并行执行,否则不能。

因此,传统上,多线程几乎等同于并发。两者都只有在硬件支持时才会变成并行。即使在这种情况下,您也可以启动比硬件支持更多的线程,并且您将面临并发。

来自Quora上Victor Eijkhout的回答


4

线程是穷人的并行处理。

编辑:更加准确地说:

线程与并行处理无关。线程的作用在于让一些进程看起来像是在并行运行。然而,这并不能使进程的所有操作总体上更快完成。


1
(-1) A. 每个工具都有其适用的场合。B. 你有什么证据支持这个观点吗? - DevinB
1
对于那些想要深入讨论的人们 - 我们可以从 http://www.prodata.lt/EN/Programming/OPU_computing_model.pdf 开始。 - Thevs
1
我删除了我的负号,因为您澄清了您的回答。 - DevinB
1
然而,线程确实可以使您的应用程序在执行方面更快,具体取决于您的应用程序。一些例子:如果下载程序同时下载多个文件,如果我将应用程序进行多线程处理,则会更快地下载所有文件,但单个文件会下载得更慢。 而在一个应用程序中,它需要做大量的计算并且偶尔需要用户输入。如果您将其放在一个线程上,那么后台计算将会停止(因为如果它们在同一个线程上,则实际上不是在后台)。 但是我同意并行和线程并不相同。 - DevinB
有时候没有解释的简短回答会得到最多的赞 :) 这是 Stackoverflow 效应吗? - Thevs
显示剩余5条评论

2

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

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

然而,你的问题似乎将多线程和并行性视为相反的概念。你是否想说使用多个进程而不是多个线程的程序?如果是这样,它们之间的区别如下:

  • 线程比进程更便宜。这就是为什么在 Web 应用程序中使用线程而不是进程会大大加速速度的原因 - 这被称为“FastCGI”。
  • 同一台计算机上的多个线程可以访问共享内存。这使得线程之间的通信更加容易,但也非常危险(很容易创建诸如竞态条件之类的错误,这些错误非常难以诊断和解决)。

2
如果我们把CPU看作一家公司,线程看作公司的员工,那么就更容易理解线程和并行编程了。
就像一家公司有许多员工一样,CPU也有许多线程。
而且可能有不止一家公司,因此可能会有不止一个CPU。
因此,当员工(线程)在一家公司(CPU)工作时,就称为线程
当两个或更多公司(CPU)独立或合作工作时,就称为并行

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接