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