并发和并行有什么区别?

时间:2009-06-26 17:18:02

标签: language-agnostic concurrency parallel-processing

并发和并行有什么区别?

赞赏例子。

37 个答案:

答案 0 :(得分:1088)

并发是指两个或多个任务可以在重叠的时间段内启动,运行和完成。这并不一定意味着它们都会在同一时刻运行。例如,单核计算机上的多任务

并行性是指字面上同时运行的任务,例如,在多核处理器上运行。


引用Sun's Multithreaded Programming Guide

  • 并发:当至少两个线程正在进行时存在的条件。一种更通用的并行形式,可以包括时间切片作为虚拟并行的一种形式。

  • 并行性:当至少两个线程同时执行时出现的情况。

答案 1 :(得分:342)

混乱存在的原因

存在混淆,因为这两个词的字典含义几乎相同:

  • 并发:同时存在,正在发生或完成(dictionary.com)
  • 平行:非常相似且经常同时发生(merriam webster)。

然而,它们在计算机科学和编程中的使用方式却截然不同。以下是我的解释:

  • 并发:中断性
  • 并行性:可独立性

那么上述定义是什么意思?

我将用现实世界的比喻来澄清。假设您必须在一天内完成2项非常重要的任务:

  1. 获得护照
  2. 完成演示
  3. 现在,问题是任务-1要求你去一个极端官僚的政府办公室,让你等了4个小时才能拿到你的护照。同时,办公室需要任务2,这是一项关键任务。两者都必须在特定日期完成。

    案例1:顺序执行

    通常情况下,你会开到护照办公室2个小时,在线等待4个小时,完成任务,开车两个小时,回家,保持清醒5个小时,然后完成演示。

    案例2:并发执行

    但你很聪明。你提前计划。你随身携带一台笔记本电脑,在排队等候时,你开始制作你的演示文稿了。这样,一旦你回到家,你只需要额外工作1小时而不是5小时。

    在这种情况下,这两项任务都是由你完成的。你在排队等候的时候打断了护照任务并进行了演示。当您的号码被呼叫时,您中断了演示任务并切换到护照任务。由于两个任务的中断性,基本上可以节省时间。

    并发,IMO,可以被理解为"隔离" ACID中的财产。如果可以以每种交错方式执行子事务并且最终结果与两个任务按顺序完成相同,则认为两个数据库事务是隔离的。请记住,对于护照和演示任务,您是唯一的刽子手

    案例3:并行执行

    现在,既然你是一个聪明的家伙,你显然是一个更高级的,你有一个助手。因此,在您离开开始护照任务之前,您打电话给他并告诉他准备演示文稿的初稿。你花了一整天的时间完成护照任务,回来看看你的邮件,然后找到演示稿。他已经完成了相当可靠的工作,并且在2个小时内进行了一些编辑,你最终确定了它。

    现在,既然你的助手和你一样聪明,他就可以独立独立工作,而无需经常要求你澄清。因此,由于任务的独立性,它们由两个不同的执行者同时执行。

    还在我身边吗?好的...

    案例4:并发但不平行

    记住你的护照任务,你必须在排队等候吗? 由于它是你的护照,你的助手不能排队等候你。因此,护照任务具有中断性(您可以在排队等待时停止它,并在稍后调用您的号码时恢复它),但没有可独立性(您的助手不能等你代替。

    案例5:并行但不并发

    假设政府办公室有进入房屋的安全检查。在这里,您必须删除所有电子设备并将其提交给官员,并且他们仅在您完成任务后返回您的设备。

    在这种情况下,护照任务既不是可独立的也不是可中断的。即使您在排队等候,也无法使用其他设备,因为您没有必要的设备。

    同样地,该演示文稿在性质上具有如此高的数学性能,您需要100%浓度至少5小时。即使您有自己的笔记本电脑,也不能在排队等待护照任务时这样做。

    在这种情况下,演示文稿任务可独立(您或您的助手可以投入5小时的精力),但不能可中断

    案例6:并发和并行执行

    现在,除了将您的助手分配到演示文稿之外,您还可以随身携带一台笔记本电脑进行护照任务。在排队等候时,您会看到助手已在共享卡组中创建了前10张幻灯片。您通过一些更正发送有关其工作的评论。之后,当你到家时,而不是2小时来完成选秀,你只需要15分钟。

    这是可能的,因为演示任务具有可独立性(你们中的任何一个可以做到)和可中断性(你可以停止并稍后恢复)。因此,您同时执行两个任务,并并行执行演示任务。

    让我们说,除了过于官僚之外,政府办公室也是腐败的。因此,你可以显示你的身份证明,输入它,开始排队等候你的号码,贿赂一个警卫和其他人来保持你的位置,潜行,在你的电话号码被召回之前回来,并恢复等待自己。

    在这种情况下,您可以同时并行执行护照和演示任务。你可以偷偷溜出来,你的位置由你的助手保管。然后你们两个都可以进行演示等。


    返回计算机科学

    在计算世界中,以下是每种情况的典型示例场景:

    • 案例1:中断处理。
    • 案例2 :当只有一个处理器时,但由于I / O,所有正在执行的任务都有等待时间。
    • 案例3 :当我们谈论map-reduce或hadoop集群时经常会看到。
    • 案例4:我认为案例4很少见。任务并发但不并行的情况并不常见。但可以发生。例如,假设您的任务需要访问一个特殊的计算芯片,只能通过处理器1访问。因此,即使处理器-2空闲且处理器1正在执行某些其他任务,特殊计算任务也无法在处理器-2上继续。
    • 案例5:也很少见,但并不像案例4那么罕见。非并发代码可以是受互斥锁保护的关键区域。启动后,必须执行完成。但是,两个不同的关键区域可以在两个不同的处理器上同时进行。
    • 案例6: IMO,关于并行或并发编程的大多数讨论基本上都在谈论案例6.这是并行和并发执行的混合搭配。

    Concurrency and Go

    如果你看到为什么Rob Pike说并发性更好,你必须明白原因是。您有一个非常长的任务,其中有多个等待期间,您等待一些外部操作,如文件读取,网络下载。在他的讲座中,他所说的只是,“只是打破这个漫长的连续任务,这样你就可以在等待的时候做一些有用的事情。”这就是为什么他会谈论不同组织与各种地鼠。

    现在,Go的优势来自于通过go关键字和渠道轻松实现这一目标。此外,运行时还有很好的底层支持来安排这些goroutine。

    但从本质上讲,并发性的并发性更好吗?

    苹果比橘子好吗?

答案 2 :(得分:226)

我喜欢Rob Pike的演讲:并发不是并行(它更好!) (slides) (talk)

Rob经常谈论Go,并且通常以直观和直观的方式解决并发与并行的问题!这是一个简短的总结:

任务:让我们烧掉一堆过时的语言手册!一次一个!

Task

并发:任务同时分解很多!一个例子:

Gophers

并行性:如果至少有2个地鼠同时工作,则以前的配置会并行发生。

答案 3 :(得分:132)

添加其他人所说的话:

并发就像让一个变戏法者玩弄很多球。无论看起来如何,这个变戏法者每次只能每手抓一个球。平行主义同时让多个变戏法者玩弄球。

答案 4 :(得分:100)

假设你有一个有两个线程的程序。该程序可以以两种方式运行:

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

在这两种情况下,我们都有并发性,因为我们有多个线程正在运行。

如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。

如果我们在具有多核CPU的计算机上运行此程序,那么我们将能够以完全相同的方式并排运行并行中的两个线程。

答案 5 :(得分:43)

并发:如果单个处理器解决了两个或更多问题。 alt text

并行性:如果多个处理器解决了一个问题。

alt text

答案 6 :(得分:33)

我将尝试用一个有趣且易于理解的例子来解释。 :)

假设组织组织国际象棋锦标赛,其中10名玩家(具有相同的国际象棋比赛技能)将挑战职业冠军国际象棋选手。因为国际象棋是1:1的比赛,所以组织者必须以时间有效的方式进行10场比赛,以便他们能够尽快完成整个赛事。

希望以下场景可以轻松描述进行这10款游戏的多种方式:

1)SERIAL - 让我们说专业人士一个接一个地与每个人一起玩,即用一个人开始和结束游戏,然后与下一个人开始下一个游戏,依此类推。换句话说,他们决定按顺序进行比赛。因此,如果一场比赛需要10分钟才能完成,那么10场比赛需要100分钟,同时假设从一场比赛转换到另一场比赛需要6秒,然后10场比赛将持续54秒(约1分钟)。

所以整个活动将在101分钟左右完成(最糟糕的方法

2)CONCURRENT - 让我们说专业人员轮到他并转移到下一位玩家所以所有10名玩家同时玩,但专业玩家不是一次两个人,他扮演他的角色转身转向下一个人。现在假设职业球员需要6秒才能轮到他,并且职业球员的转换时间为两个球员的时间是6秒,所以回到第一个球员的总转换时间将是1分钟(10x6秒)。因此,当他回到第一个人,事件开始时,已经过了2分钟(10xtime_per_turn_by_champion + 10xtransition_time = 2mins)

假设所有玩家需要45秒完成转弯,所以基于SERIAL事件的每场比赛10分钟,没有。比赛结束前的比赛应该是600 /(45 + 6)= 11轮(大约)

所以整个事件将在11xtime_per_turn_by_player_& _champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins(大约)

大致完成

将改善时间从101分钟改为20.35分钟(更好的方法

3)PARALLEL - 让我们说组织者获得一些额外的资金,因此决定邀请两位职业冠军球员(两位同样有能力)并分配相同的10名球员(挑战者)分为两组,每组5人,并分配给两名冠军,即每组一名。现在这两场比赛的进展顺利进行,即至少有两名球员(每组一名)与各自组别的两名职业球员比赛。

然而,在团体内,职业选手一次只能拿一名球员(即顺序),所以没有任何计算,你可以很容易地推断出整个赛事大约在101/2 = 50.5分钟内完成

将改进时间从101分钟改为50.5分钟(良好的方法

4)CONCURRENT + PARALLEL - 在上面的场景中,让我们说这两位冠军球员将与他们各自组中的5名球员同时进行(阅读第2分),所以现在各组之间的比赛正在运行并行但在组内它们同时运行。

所以一组中的游戏将在11xtime_per_turn_by_player_& _champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins(大约)

大致完成

所以整个事件(涉及两个这样的并行运行组)将在15.5分钟左右完成

将改进时间从101分钟改为15.5分钟( BEST APPROACH

注意:在上述情况下,如果您用10个类似的作业替换10个玩家,而使用两个CPU核心替换两个专业玩家,那么以下顺序将保持不变:

SERIAL> PARALLEL> CONCURRENT>并发+ PARALLEL

(注意:此顺序可能会因其他方案而改变,因为此排序高度依赖于作业的相互依赖性,通信需要黑白作业和转换开销黑白作业)

答案 7 :(得分:28)

并发性:   多个执行流程,可能共享资源

例:   两个线程竞争I / O端口。

paralelism:   将问题分成多个相似的块。

例:   通过在文件的每一半上运行两个进程来解析大文件。

答案 8 :(得分:25)

简单示例:

并发:“两个队列访问一台ATM机”

并行是:“两个队列和两台ATM机”

答案 9 :(得分:24)

他们解决了不同的问题。并发解决了CPU资源稀缺和许多任务的问题。因此,您可以通过代码创建线程或独立的执行路径,以便在稀缺资源上共享时间。直到最近,由于CPU可用性,并发性在讨论中占主导地位。

并行性解决了找到足够的任务和适当的任务(可以正确拆分的任务)并在丰富的CPU资源上分配它们的问题。并行性一直存在,但它已经走到了前列,因为多核处理器非常便宜。

答案 10 :(得分:14)

想象一下,通过观看视频教程来学习新的编程语言。您需要暂停视频,应用代码中所说的内容然后继续观看。 那是并发性。

现在你是一名专业程序员。而且您喜欢在编码时聆听平静的音乐。 那是并行性。

享受。

答案 11 :(得分:12)

并发编程执行有两种类型:非并行并发编程和并行并发编程(也称为并行性)。

关键区别在于,在人眼中,非并行并发中的线程似乎在同时运行,但实际上却不是。在非并行并发线程中,线程会快速切换,并通过时间分片轮流使用处理器。 在并行处理中,有多个处理器可用,因此,多个线程可以同时在不同的处理器上运行。 enter image description here

参考:Introduction to Concurrency in Programming Languages

答案 12 :(得分:9)

将其视为服务队列,其中服务器只能为队列中的第一个作业提供服务。

1个服务器,1个作业队列(包含5个作业) - >没有并发性,没有并行性(只有一个作业被完成服务,队列中的下一个作业必须等到服务作业完成,并且没有其他服务器为它提供服务)

1个服务器,2个或更多个不同的队列(每个队列有5个作业) - >并发(因为服务器与队列中的所有第一个作业共享时间,相同或加权),仍然没有并行性,因为在任何时刻,都有一个且唯一的工作正在服务。

2个或更多服务器,一个队列 - >并行性(在同一时刻完成2个作业)但没有并发(服务器没有共享时间,第三个作业必须等到服务器完成一个。)

2个或更多服务器,2个或更多个不同的队列 - >并发性和并行性

换句话说,并发是共享时间来完成一项工作,它可能需要相同的时间来完成它的工作,但至少它可以提前开始。重要的是,工作可以分成较小的工作,这允许交错。

并行性是通过并行运行的更多CPU,服务器,人员等来实现的。

请记住,如果资源是共享的,那么就无法实现纯粹的并行性,但这就是并发性最佳实际应用的地方,占用了另一个不需要该资源的工作。

答案 13 :(得分:8)

并发 =>当在具有共享资源的重叠时间段内执行多个任务时(可能最大化资源利用率)。

并行 =>当单个任务被分成多个简单的独立子任务时,可以同时执行。

答案 14 :(得分:7)

我将提供一个与这里的一些流行答案有点冲突的答案。在我看来,并发性是一个包含并行性的通用术语。 并发适用于不同任务或工作单元及时重叠的任何情况。 Parallelism 更具体地适用于在相同物理时间评估/执行不同工作单元的情况。平行主义的存在理由是加速可以从多个物理计算资源中受益的软件。适合并发的另一个主要概念是交互性。当从外部世界观察到任务的重叠时,交互性适用。互动的存在理由是制作能够响应现实世界实体的软件,如用户,网络同行,硬件外围设备等。

并行性和交互性几乎完全是并发的独立维度。对于特定项目,开发人员可能会关心其中之一,两者都不关心。他们倾向于混淆,尤其是因为线程的憎恶给了两者相当方便的原语。

关于并行性的更多细节

并行性存在于非常小的尺度(例如处理器中的指令级并行性),中等尺度(例如多核处理器)和大规模(例如高性能计算集群)。由于多核处理器的增长,近年来软件开发人员面临更多线程级并行性的压力越来越大。并行性与依赖的概念密切相关。依赖性限制了并行度的实现程度;如果一个任务取决于另一个任务,则无法并行执行两个任务(忽略推测)。

程序员使用许多模式和框架来表达并行性:管道,任务池,数据结构上的聚合操作(“并行数组”)。

关于互动性的更多细节

进行交互的最基本和最常用的方法是使用事件(即事件循环和处理程序/回调)。对于简单的任务,事件很棒。尝试用事件做更复杂的任务进入堆栈翻录(a.k.a.回调地狱; a.k.a.控制反转)。当你厌倦了事件时,你可以尝试更多奇特的东西,如生成器,协程(a.k.a.Async / Await)或协作线程。

对于对可靠软件的热爱,如果你想要的是交互性,请不要使用线程。

<强> Curmudgeonliness

我不喜欢Rob Pike的“并发性不是并行性;它更好”的口号。并发性既不比并行性更好也不差。并发性包括交互性,无法以更好/更差的方式与并行性进行比较。这就像是说“控制流程比数据更好”。

答案 15 :(得分:7)

并行化是在multiple cores per CPUmultiple CPUs (on a single motherboard)上同时执行进程。

并发性是指通过使用调度算法single core CPU进行并行化来划分CPU时间(时间片) )。进程是交错的

单位:

  • 一个CPU中的1个或多个内核(几乎是所有现代处理器)
  • 主板上的1个或多个CPU (想想老式服务器)
  • 1个应用程序是1个程序(认为Chrome浏览器)
  • 1个程序可以有1个或多个进程(认为每个Chrome浏览器标签都是一个进程)
  • 1个进程可以有1个程序中的1个或多个线程(Chrome标签页以1个线程播放Youtube视频,另外一个线程生成了评论部分,另一个线程则提供了用户登录信息)
  • 因此,一个程序可以有1个或多个执行线程
  • 1个进程为thread(s)+allocated memory resources by OS (堆,寄存器,堆栈,类 内存)

答案 16 :(得分:6)

在电子设备中串行并行表示一种静态拓扑,确定电路的实际行为。当没有并发性时,并行性是确定性的

为了描述动态的与时间相关的现象,我们使用术语顺序并发。例如,可以通过任务的某个序列获得某个结果(例如,食谱)。当我们与某人交谈时,我们正在制作一系列单词。然而,实际上,许多其他过程在同一时刻发生,因此,同意到某个动作的实际结果。如果很多人同时说话,并发谈话可能会干扰我们的序列,但这种干扰的结果是事先不知道的。 并发引入了不确定性

串行/并行和顺序/并发表征是正交的。这方面的一个例子是数字通信。在串行适配器中,数字消息在时间上(即顺序)沿同一通信线路(例如,一条线路)分布。在并行适配器中,这也在并行通信线路(例如,许多线路)上划分,然后在接收端重建。

让我们想象一个有9个孩子的游戏。如果我们将它们作为链条处理,首先给出一条消息并在结束时接收它,我们将进行串行通信。更多的单词构成了消息,包含一系列通信统一。

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....

这是在串行基础设施上重现的顺序流程

现在,让我们将图像划分为3个组。我们将这个短语分为三个部分,第一个给我们左边的线的孩子,第二个给中心线的孩子等等。

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....

这是在并行基础架构上重现的顺序流程(尽管仍然部分序列化)。

在这两种情况下,假设孩子之间有完美的沟通,结果提前确定

如果有其他人与您同时与第一个孩子交谈,那么我们将有并发流程。我们不知道基础设施将考虑哪个流程,因此最终结果是未确定

答案 17 :(得分:5)

并发性是并行性的一般形式。例如,并行程序也可以被称为并发,但反向不是真的。

  1. 可以在单个处理器上同时执行(多个线程,由调度程序或线程池管理)

  2. 在单个处理器上但在多个处理器上无法并行执行。 (每个处理器一个进程)

  3. 分布式计算也是一个相关的主题,它也可以称为并发计算,但反之则不然,就像并行性一样。

  4. 有关详细信息,请阅读本研究论文 Concepts of Concurrent Programming

答案 18 :(得分:4)

我真的很喜欢保罗·布彻的answer这个问题(他是七周七种并发模型的作者):

  

尽管它们经常被混淆,但并行性和并发性却是如此   不同的东西。 并发是问题域的一个方面 -your   代码需要同时处理多个(或几乎同时)   事件。相反,并行性是解决方案的一个方面   域 - 您希望通过处理使您的程序运行得更快   问题的不同部分并行。有些方法是   适用于并发,一些适用于并行,一些适用于两者。   了解您面临的问题并选择合适的工具   工作

答案 19 :(得分:4)

我真的很喜欢另一个答案中的这种图形表示形式-我认为它比上面的许多答案更好地回答了问题

并行性与并发性 当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程A和B,则它们的并行执行将如下所示:

CPU 1:A ------------------------->

CPU 2:B ------------------------->

两个线程同时运行时,它们的执行重叠。重叠可能以两种方式之一发生:要么线程同时执行(即如上所述并行执行),要么它们的执行在处理器上交织在一起,就像这样:

CPU 1:A -----------> B ----------> A -----------> B ----- ----->

因此,出于我们的目的,可以将并行性视为并发的特殊情况

来源:Another answer here

希望有帮助。

答案 20 :(得分:3)

并发可以涉及同时或不同时运行的任务(它们确实可以在单独的处理器/核心中运行,但它们也可以在&#34; ticks&#34;中运行)。什么是重要是并发总是指做一个更大的任务。所以基本上它是一些计算的一部分。你必须聪明地了解你可以同时做什么,不做什么以及如何同步。

并行性意味着您只是同时做一些事情。他们不需要成为解决一个问题的一部分。例如,您的线程可以解决每个问题。当然同步的东西也适用,但从不同的角度来看。

答案 21 :(得分:3)

  

并发编程关于看似重叠的操作,主要关注由于非确定性控制流而引起的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常是IO绑定但不总是,例如,并发垃圾收集器完全在CPU上。并发程序的教学示例是Web爬行程序。该程序启动对网页的请求,并在下载结果可用时同时接受响应,累积已经访问过的一组页面。控制流是不确定的,因为每次运行程序时,响应不一定以相同的顺序接收。这种特性使得调试并发程序变得非常困难。一些应用程序基本上是并发的,例如Web服务器必须同时处理客户端连接。 Erlang可能是即将推出的高度并发编程语言。

     

并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流确定性来避免并发编程的困难。通常,程序会生成并行运行的子任务集,而父任务仅在每个子任务完成后才会继续。这使得并行程序更容易调试。并行编程的难点在于粒度和通信等问题的性能优化。后者在多核的背景下仍然是一个问题,因为将数据从一个缓存传输到另一个缓存有相当大的成本。密集矩阵 - 矩阵乘法是并行编程的教学实例,可以通过使用Straasen的分治算法并行地攻击子问题来有效地求解。 Cilk可能是共享内存计算机(包括多核)上最有前途的高性能并行编程语言。

从我的回答中复制:https://stackoverflow.com/a/3982782

答案 22 :(得分:3)

“并发”是指正在进行中的多个内容。

“并行”是指并发事物同时进展

没有并行性的并发示例:

  • 单核上的多个线程。
  • Win32消息队列中的多条消息。
  • MARS连接上的多个SqlDataReader
  • 浏览器标签中的多个JavaScript promises

但请注意,并发性和并行性之间的差异通常是透视问题。从执行代码(可观察到的影响)的角度来看,上述示例是非平行的。但即使在单个核心内也存在指令级并行性。有些硬件与CPU并行处理,然后在完成时中断CPU。在执行window procedure或事件处理程序时,GPU可能会绘制到屏幕。当您仍在获取前一个查询的结果时,DBMS可以遍历B-Trees以进行下一个查询。浏览器可能正在执行您的Promise.resolve()时进行布局或网络连接。等等...

所以你去吧。世界一如既往地混乱;)

答案 23 :(得分:2)

并发与并行性

'Concurrency Is Not Parallelism'中的刺刺鱼

并发是指一次处理很多事情。

平行主义是关于一次做很多事情。

[Concurrency theory]

并发-处理等待操作
并行性-处理线程内容

我对并发和并行的看法

enter image description here

[Sync vs Async]

答案 24 :(得分:2)

(令我惊讶的是,这么一个基本问题多年来没有正确,整齐地解决...)

简而言之,并发性和并行性都是 computing 的属性。

根据不同之处,这里是the explanation from Robert Harper

  

首先要了解的是并行性与并发无关。并发与程序(或其组成部分)的不确定组成有关。并行性与具有确定性行为的程序的渐近效率有关。并发就是管理难以处理的事情:事件由于无法控制的原因而到达,我们必须对此做出回应。用户单击鼠标,即使显示需要引起注意,窗口管理器也必须响应。这种情况本质上是不确定性的,但我们还通过假装组件以任意顺序发出信号来确定性地采用形式非确定性,并且我们必须在事件发生时对其进行响应。非确定性组合是强大的程序结构构想。另一方面,并​​行性是关于确定性计算的子计算之间的依赖性的。结果是毋庸置疑的,但是有很多方法可以实现它,有些方法比其他方法更有效。我们希望充分利用这些机会。

它们可以是程序中的各种正交属性。阅读this blog post了解更多说明。 this one稍微讨论了有关编程中的组件(如线程)的区别。

请注意,线程化或多任务处理都是为实现更具体目的而进行的所有计算实现。它们可以与并行性和并发性相关,但不是必须的。因此,它们并不是开始解释的好方法。

另一个要点:(物理)“时间”几乎与此处讨论的属性无关。时间只是执行测量以显示特性重要性的一种方式,但与本质相去甚远。仔细考虑“时间”在时间复杂度中的作用-或多或少是相似的,即使在这种情况下,度量通常也更重要。

答案 25 :(得分:2)

在我看来,理解这两者最简单,最优雅的方式就是这个。并发允许交错执行,因此可以提供并行性的幻觉。这意味着并发系统可以在您使用Word编写文档的同时运行Youtube视频。作为并发系统的底层操作系统使这些任务能够交错执行。由于计算机如此快速地执行指令,因此可以同时执行两项操作。

并行性是指这些事物真正并行。在上面的示例中,您可能会发现视频处理代码正在单个核心上执行,而Word应用程序正在另一个核心上运行。请注意,这意味着并发程序也可以并行!使用线程和进程构建应用程序使您的程序可以利用底层硬件并可能并行完成。

为什么不把一切都平行呢?一个原因是因为并发性是结构化程序的一种方式,并且是促进关注点分离的设计决策,而并行性通常以性能的名义使用。另一个原因是,有些事情根本无法完全并行完成。一个例子是在队列的后面添加两个东西 - 你不能同时插入两个东西。必须首先出现一些事情,然后是另一个事件,否则你就会陷入困境。虽然我们可以交错这样的执行(因此我们得到一个并发队列),但你不能让它并行。

希望这有帮助!

答案 26 :(得分:2)

<强>平行度: 具有多个线程执行类似的任务,这些任务在它们需要的数据和资源方面彼此独立。例如:Google抓取工具可以生成数千个线程,每个线程都可以独立完成任务。

<强>并发性: 当您拥有共享数据,线程之间的共享资源时,并发就会出现。在事务系统中,这意味着您必须使用锁定,信号量等技术来同步代码的关键部分。

答案 27 :(得分:1)

this source的解释对我有帮助:

  

并发与应用程序如何处理多个任务有关   继续努力。应用程序可以在一时处理一个任务   (顺序)或同时处理多个任务   (同时)。

     另一方面,并​​行性与应用程序的关系有关   处理每个单独的任务。应用程序可以处理该任务   从开始到结束连续,或将任务分成子任务   可以并行完成。

     

如您所见,应用程序可以是并发的,但不是并行的。   这意味着它同时处理多个任务,但是   任务不会分解为子任务。

     

应用程序也可以是并行但不是并发的。这意味着   应用程序一次只能处理一个任务,而且这个任务   被分解为可以并行处理的子任务。

     

此外,应用程序既不能并发也不能并行。   这意味着它一次只能处理一个任务,任务就是   永远不会分解为并行执行的子任务。

     

最后,应用程序也可以是并发和并行的   它既可以同时处理多个任务,也可以打破   每个任务都进入子任务并行执行。但是,有些   并发和并行的好处可能会在此丢失   方案,因为计算机中的CPU已经保持相当繁忙   单独使用并发或并行。结合它可能会导致   只有很小的性能提升甚至性能损失。

答案 28 :(得分:1)

Pike的&#34;并发概念&#34;是一个有意的设计和实施决定。具有并发能力的程序设计可能会也可能不会表现出行为和并行性能#34 ;;它取决于运行时环境。

您不希望程序没有针对并发性而展示并行性。 :-)但是,如果它是相关因素(功耗,性能等)的净增益,则需要最大并发设计,以便主机系统可以在可能的情况下并行执行。

Pike的Go编程语言说明了这一点:他的函数是可以同时正确运行的所有线程,即调用函数总是创建一个线程,如果系统能够与调用者并行运行它。拥有数百甚至数千个线程的应用程序在他的世界中是完全平凡的。 (我不是专家,这只是我对它的看法。)

答案 29 :(得分:1)

并发简单意味着正在运行多个任务(并非必须并行)。例如,我们在任何时刻都有3个任务:可能正在运行多个任务,或者所有可能同时运行。

并行意味着它们实际上并行运行。因此,在这种情况下,所有三个必须同时运行。

答案 30 :(得分:1)

摘自罗伯特·洛夫(Robert Love)的《 Linux系统编程》 一书:

并发,并行和种族

线程创建两个相关但截然不同的现象:并发和 并行性。两者都是苦乐参半,涉及线程的成本 以及它的好处。 并发是两个或多个的能力 在期间的重叠时间内执行的线程。 平行主义是 能够同时执行两个或多个线程的功能。 并发可以在没有并行性的情况下发生:例如,多任务处理 在单处理器系统上。并行性(有时强调为 真正的并行性)是一种特殊的并发形式,需要多个处理器(或具有多个引擎的单个处理器) (例如GPU)。通过并发,多个线程可以 前进,但不一定同时。用 并行性,线程实际上是并行执行的,从而允许 多线程程序来利用多个处理器。

并发是一种编程模式,是解决问题的一种方式。 并行是一种硬件功能,可以通过并发实现。 两者都很有用。

此说明与接受的答案一致。实际上,这些概念比我们想象的要简单得多。不要认为它们是魔术。并发大约一段时间,而并行则大约同时同时同时

答案 31 :(得分:1)

太好了,让我用一个场景来展示我的理解。 假设有3个孩子名字:A,B,C。A和B说话,C听。 对于A和B,它们是平行的: A:我是A. B:我是B。

但是对于C来说,他的大脑必须采用并发过程来听A和B,它可能是: 我是我是B。

答案 32 :(得分:0)

“并发”正在同时执行任何操作。它们可以是不同的事物,也可以是相同的事物。尽管缺少公认的答案,但这并不是关于“似乎同时出现”。确实是在同一时间。您需要多个CPU内核(使用一台主机内的共享内存或不同主机上的分布式内存)来运行并发代码。一个示例是同时运行的3个不同任务的管道:任务级别2必须等待任务级别1完成的单元,而任务级别3必须等待任务级别1完成的单元任务级别2。另一个例子是1个生产者与1个消费者的并发。或许多生产者和1个消费者;读者和作家;等

“并行”在同一时间做相同的事情。它是并发的,但是它是同时发生的相同行为,并且通常是在不同数据上发生的。矩阵代数通常可以并行化,因为您需要重复运行相同的操作:例如,可以使用相同的行为(总和)在不同的列上同时计算矩阵的列总和。在可用处理器内核之间划分(拆分)列是一种常见的策略,这样您就可以接近每个处理器内核要处理的相同数量的工作(列数)。分散工作的另一种方法是任务袋,完成工作的工人可以回到经理那里,后者分发工作并动态地获得更多工作,直到一切完成为止。票务算法是另一种。

不仅数字代码可以并行化。文件经常可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每个文件,您可能需要计算文档中标记的数量。这是并行的,因为您要为每个文件计数令牌,这是相同的行为。

换句话说,并行是指同时执行相同的行为。并发是指同时,但不一定是相同的行为。并行是一种特殊的并发,其中同一件事同时发生。

例如,术语将包括原子指令,关键部分,互斥,自旋等待,信号量,监视器,障碍,消息传递,映射减少,心跳,振铃,票务算法,线程,MPI,OpenMP。

格雷戈里·安德鲁斯(Gregory Andrews)的著作是一本顶级教科书:多线程,并行和分布式编程。

答案 33 :(得分:0)

此惊人的blog的摘录:

  

并发性与并行性之间的区别:

     

并发是两个任务可以在其中开始,运行和完成的时间   重叠的时间段。并行性是指任务在字面上运行的时间   同时,例如在多核处理器上。

     

并发是独立执行的流程的组成,   而并行性是(可能是相关的)同时执行   计算。

     

并发是指一次处理很多事情。平行性   是关于一次完成很多事情

     

一个应用程序可以是并发的,但不能是并行的,这意味着   它同时处理多个任务,但没有两个任务   同时执行。

     

一个应用程序可以是并行的,但不能是并行的,这意味着   它可以同时在多核CPU中处理任务的多个子任务   时间。

     

应用程序既不能是并行的,也不能是并发的,这意味着   它一次一次地处理所有任务。

     

一个应用程序可以是并行的,也可以是并发的,这意味着   它可以同时在多核CPU中同时处理多个任务   时间。

答案 34 :(得分:0)

简单来说,并发就是一次处理很多事情

单词“ dealing”(加价)用粗体表示并发并行性之间的区别。一次处理很多事情意味着一次完成很多事情,但是它们是否同时执行并不重要。另一方面,进行并行化意味着一次执行很多事情(同时执行)。因此,可以使用一个或多个处理资源来实现并发上下文。使用一种处理资源一次性处理很多事情意味着您通过在任务之间执行context switching来同时执行许多事情。另一方面,具有许多处理资源的并发上下文意味着进行并行处理。 这意味着我们正在通过并行进行并发,反之亦然。

您可能想在我的article中了解有关并发和并行性及其与当今技术的关系的更多信息。

答案 35 :(得分:0)

仅仅是为其他好的答案添加更多的说明:

前提是抽象的处理(CPU是一个可以想象的例子)可以在同一时刻运行唯一任务,

并发是关于处理的非常抽象的故事:它可以在不同的任务之间切换。

并行性是一个关于我们具有多个处理抽象的故事(例如,我们的CPU具有多个内核)。因此, 是我们系统同时执行多项任务( literally )的能力的原因。但是这里没有提到处理的特定抽象(它们是否并发)。

这里的重点是关于这些故事的

因此,在阅读接受的答案时要注意:

  

并发是两个或多个任务可以在其中开始,运行和完成的时间   重叠的时间段。

严格地说,可以基于该定义得出结论,即并行性本身就要求并发。

答案 36 :(得分:-4)

通过查阅字典,你可以看到并发(来自拉丁语)意味着一起运行,收敛,同意;因为在相同的资源上存在竞争,所以需要同步。平行(来自希腊语)意味着复制在一边;同时做同样的事情。