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