Ric*_*dOD 39
Daniel Moth(我的前同事) - Threading/Concurrency vs Parallelism文章解释了这一切.
引:
要利用我们软件中的多个内核,最终必须使用线程.由于这个事实,一些开发人员陷入了将多线程等同于并行性的陷阱.这不准确......您可以在单核计算机上进行多线程处理,但只能在多核计算机上进行并行处理
快速测试:如果在单核心机器上使用线程并且它对你的场景非常有意义,那么你就不是"做并行性",你只是做多线程.
有两种不同类型的并发:
如您所见,它们解决了完全不同类型的问题。
线程通常被称为在一个CPU上同时有多个进程同时工作(实际上你并不认为它们会这样做,但它们之间的切换速度非常快).
并行性使多个进程在多个CPU上同时工作.
两者都有很大的优缺点,具体取决于操作系统使用的调度程序.通常,创建线程的计算成本远低于在另一个CPU上生成进程,但是为自己拥有一个"整体"CPU可以提高该进程的整体速度.但是,如果该进程需要与另一个CPU上的另一个进程通信,则需要解决IPC(进程间通信)问题,这可能是一个开销,以至于在同一个CPU上使用线程实际上更好.
大多数操作系统都知道多个CPU /核心并且可以使用它们,但这使得调度程序通常非常复杂.
如果您使用的是使用VM(虚拟机)的语言编程,请注意他们需要实现自己的调度程序(如果有的话).例如,Python使用GIL,它几乎都说该VM上运行的所有内容始终位于同一个CPU上.虽然某些操作系统能够将繁重的进程迁移到另一个目前不那么繁忙的CPU,这当然意味着整个过程需要在执行时暂停.
像DragonFlyBSD这样的操作系统采用了一种完全不同的调度方法,那么此时的"标准"方法是什么.
我认为这个答案为您提供了足够的关键字来搜索更多信息:-)
并行性是使用多个指令流来完成计算的一般技术.所有并行技术的关键方面是在流之间进行通信以协作最终答案.
线程化是并行性的具体实现.每个指令流都有自己的堆栈,用于记录局部变量和函数调用,并通过共享内存隐式地与其他流进行通信.
一个示例可能是让一个线程简单地将磁盘请求排队并将其传递给工作线程,从而有效地并行化磁盘和CPU.传统的UNIX管道方法是将它们分成两个完整的程序,在命令中说"cat"和grep:
cat /var/log/Xorg.0.log | grep "EE"
Run Code Online (Sandbox Code Playgroud)
可以想象,线程可以降低将磁盘I/O从cat进程复制到grep进程的通信成本.
这是消除任何人对并行性和线程相关疑虑的最佳答案。
线程是一种软件构造。即使在旧的单核处理器上,我也可以启动任意数量的 pthread。所以多线程不一定是并行的:只有硬件能够支持它才是并行的。因此,如果您有多个核心和/或超线程,您的多线程就会变得并行。事实上,现在大部分时间都是这样。
并发是指没有明确时间顺序的活动。同样,如果硬件支持,它们可以并行完成,如果不支持,则不能。
因此,传统上多线程几乎是并发的代名词。只有硬件支持,它们才可以并行。即使如此,您也可以启动比硬件支持的多得多的线程,并且您将面临并发性。
来自Victor Eijkhout 在 Quora 上的回答。