并行性意味着并发,但不是相反吗?


15

我经常读到并行性和并发性是不同的东西。答题者/评论者经常会写到他们是两个完全不同的事物。但是我认为它们是相关的,但我想对此进行一些说明。

例如,如果我在多核CPU上并设法将计算分成x个较小的计算(例如使用fork / join),每个计算均在其自己的线程中运行,则我将拥有一个同时进行并行计算的程序(因为大概在任何时候,几个线程都将在多个内核上运行)并且是并发的吗?

虽然如果我只是简单地使用Java,并处理事件调度线程上的UI事件和重绘,再运行我创建的唯一线程,那么我将拥有一个并发程序(EDT + GC线程+我的主线程)等),但不是并行的。

我想知道我是否正确,并行性(在“单核但多核”系统上)是否总是暗示并发?

另外,是否在多核CPU上运行多线程程序,但是不同线程在进行完全不同的计算的情况下是否考虑使用“并行性”?


Answers:


13

根据维基百科

并行计算是一种计算形式,其中许多计算同时进行,其原理是大问题通常可以分为较小的问题,然后并行解决(“并行”)。

也就是说,并行性总是意味着并发。

另外,是否在多核CPU上运行多线程程序,但是不同线程在进行完全不同的计算的情况下是否考虑使用“并行性”?

不会。并行性的本质是将一个大问题分为多个小问题,以便可以同时解决多个小问题。各个部分是相互独立的(至少在某种程度上是相互独立的),但它们仍然是较大问题的一部分,目前正在并行解决。

并发性的本质是,多个线程(或进程,或计算机)正在做的事情同时,可能(但不一定)在某些方面进行交互。再次维基百科

并发性是系统的属性,在该系统中,多个计算同时执行,并且可能彼此交互。


4
很棒的帖子。并行是并发的子集。

3
抱歉,此答案不正确。您绝对可以在没有并发的情况下具有并行性(例如,位级并行性),实际上,这是两个截然不同的概念。并发是关于组成独立的执行单元,而并行是关于同时执行潜在关联的计算。
凯塞格伦2015年

@KaiSellgren:请引用一些消息来源以支持您的陈述。
乔纳斯·普拉卡

第一个Wikiquote完全是错误的。幸运的是,它在前一段时间已修复,现在可以正确地指出并行性不依赖于并发。
凯·塞格伦2015年

确实,这就是Wiki条目当前所说的(可以在没有并发的情况下具有并行性(例如位级并行性))。但是我一点都不明白。难道位级并行性不是可以想象的最并发的事情-用更少的指令执行更多的操作,然后不是其中一些操作在同一条指令内执行,即同时执行,即并发执行吗?
乔纳斯·普拉卡

3

代码可以是并发的,但不能并行。

想象一下在单核计算机上运行的多个线程。该单核计算机一次只能处理一个线程,因此不会有操作并行性。但是对于每个线程,由于操作系统如何处理多个线程,因此每个线程都需要假定所有其他线程同时运行。


0

并行仅意味着同时执行许多任务。另一方面,并​​发性是内核通过在多个进程之间不断切换来执行许多任务的能力。

为了实现并行性,重要的是系统应仅具有多个内核,然后才能有效地实现并行性。如果在单核计算机上尝试并行处理,则性能会受到很大影响,并且会产生大量开销。

例如,较早的系统只有一个内核,而CPU调度程序会通过在进程之间不断切换而使每个进程取得进展,从而给人以并行的错觉。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.