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

Dha*_*ana 36 parallel-processing multithreading

线程和并行之间有什么区别?

哪一个优于另一个?

Ric*_*dOD 39

Daniel Moth(我的前同事) - Threading/Concurrency vs Parallelism文章解释了这一切.

引:

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

快速测试:如果在单核心机器上使用线程并且它对你的场景非常有意义,那么你就不是"做并行性",你只是做多线程.

  • 好文章!可能值得在这里添加一个简短的摘要或引用,以对冲链接腐烂. (3认同)

Ale*_*ent 8

有两种不同类型的并发:

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

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


Pau*_*ams 6

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


Mar*_*wig 6

线程通常被称为在一个CPU上同时有多个进程同时工作(实际上你并不认为它们会这样做,但它们之间的切换速度非常快).

并行性使多个进程在多个CPU上同时工作.

两者都有很大的优缺点,具体取决于操作系统使用的调度程序.通常,创建线程的计算成本远低于在另一个CPU上生成进程,但是为自己拥有一个"整体"CPU可以提高该进程的整体速度.但是,如果该进程需要与另一个CPU上的另一个进程通信,则需要解决IPC(进程间通信)问题,这可能是一个开销,以至于在同一个CPU上使用线程实际上更好.

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

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

像DragonFlyBSD这样的操作系统采用了一种完全不同的调度方法,那么此时的"标准"方法是什么.

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


jld*_*ger 6

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

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

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

cat /var/log/Xorg.0.log | grep "EE"
Run Code Online (Sandbox Code Playgroud)

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


Iqr*_*ra. 5

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

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

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

因此,传统上多线程几乎是并发的代名词。只有硬件支持,它们才可以并行。即使如此,您也可以启动比硬件支持的多得多的线程,并且您将面临并发性。

来自Victor Eijkhout 在 Quora 上的回答