language-agnostic - 并发和并行有什么区别?

  显示原文与译文双语对照的内容

并发和并行有什么区别? 任意示例

时间:

当两个任务可以在重叠的时间段内启动,运行和完成时,可以使用英镑 这并不意味着他们会同时同时运行。 在single-core机器上多任务。

当任务在同一时间运行时,并行,例如。 在多核处理器上。

太阳多线程编程指南的引用 :

  • 并发:当至少有两个线程正在进行进程时存在的条件。 一种更一般化的并行形式,它可以包含time-slicing作为虚拟并行形式。

  • 并行性:当至少两个线程同时执行时产生的一个条件。

我喜欢Rob的: 并发不是并行( 它更好) ( 幻灯片)( 通话)

Rob通常谈到go去 and,通常在直观和直观的解释中解决并发 vs 并行性的问题 ! 下面是简短的总结:

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

Task

并发:任务的并发分解有许多并发的分解 ! 一个例子:

Gophers

并行性:之前的配置出现在平行如果至少有 2 gophers工作在同一时间。

添加到其他人所说的:

并发就像一个小丑摆弄许多球。 不管它看起来如何,小丑每次只捕捉/投掷一个球。 并行同时有多个jugglers杂耍球。

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

  • 并发: 已经存在,发生或者在同一 time(dictionary.com) 处完成
  • 并行: 非常相似且经常在同一个 time(merriam webster) 上发生。

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

  • 并发: Interruptability
  • 并行: Independentability

那么上述定义的含义是什么? 我将用一个真实的世界来解释。 假设你必须在一天内完成 2个非常重要的任务

  1. 获得 Passport
  2. 获取演示文稿

现在问题是task-1要求你去一个非常bureaucratic的政府办公室,它让你在一行等候 4小时来获得你的护照。 尽管task-2需要为你的办公室完成,但它是一个关键的。 这两个都必须在特定的日期完成。

Case-1:顺序执行通常,你会开车去护照办公室 2小时,在等待 4小时,完成任务,驱车返回两个小时,回家,远离 5更小时,完成演示。

Case-2: 并发执行:,但你聪明。 你提前计划。你要做的就是随身携带一台笔记本电脑,在排队等候,你就开始在你的演示中工作。 这样,一旦你回到家,你只需要工作一个额外的小时而不是 5小时。 在这种情况下,这两个任务都是由你完成的,只是部分的。 你在排队等候时中断了passport任务,并在演示文稿中工作。 当你的号码被呼叫时,你中断了演示任务并切换到passport任务。 节省的时间基本上是可能的,因为这两个任务都有 interruptability 。 并发性,国际海事组织,应被视为"隔离" database.Two 数据库事务的acid属性满足隔离要求如果你执行sub-transactions用任何交叉方式和最终结果是一样,如果两个任务连续完成。 记住,对于护照和演示任务,你是唯一的执行者。

Case-3: 现在并行执行,因为你是一个聪明人,显然你是一个更高的人,并且有一个助手。 现在,在你离开进行passport任务之前,你可以打电话给他并告诉他准备演示文稿的初稿。 你花一整天,完成护照的任务,回来看到你的邮件,你会发现报告草案。 他做了一个相当扎实的工作,在 2小时内进行了一些编辑,你最终完成了它。 现在,既然你的助手和你一样聪明,他就可以独立工作了,不需要你去不断的澄清。 因此,由于任务的independentability,它们被两个不同的executioners同时执行。

还跟我一起好的。

Case-4: 并发但不平行请记住你的passport任务,你必须在该行中等待? 在这种情况下,注意到,因为它是护照,你的助理不能等待的人打来电话要找你。 因此,passport任务有 interruptability ( 你可以在排队时停止它,稍后在你的号码被调用时继续),但没有 independentability(your assistant cannot wait in your stead) 。

Case-5:平行但不并发说,政府办公室安全检查进入的前提。 在这里,你必须卸下所有电子设备,并将它们提交给你在完成任务后才返回的警官。 在这里情况下,passport任务既不独立也不可以中断。 即使你在排队等候,因为你没有必要的设备,你不能在其他地方工作。 类似地,假设演示文稿在本质上是高度数学的,你需要 100%个浓度至少 5小时。 即使你带着你的笔记本电脑,你也不能在排队等候passport任务。 在这种情况下,演示任务是 independent(either you or your assistant can put 5 hours of focused effort),,但不是可以中断的。

Case-6: 并发和并行执行现在说除了给演示文稿指派助手之外,你还携带了一个笔记本,用于passport任务。 在排队等候时,你会看到助手在共享的甲板上创建了前 10张幻灯片。 你向他发送评论,纠正他。 因此,现在回到家中,而不是花 2小时来完成草稿,你只需要 15分钟。 这是因为演示任务有 independentability(either one of you can do it) 和 interruptability(you can stop it and resume it later) 。 所以同时同时执行任务和只执行执行的演示任务。

让我们说,除了过度的官僚主义,政府办公室已经被破坏了。 因此,你可以输入,显示你的身份,开始为你的号码被称为排队,把一些钱给门卫,让别人把你的位置线,溜出去,你的号码被称为前回来,恢复它。

在这种情况下,你可以同时同时同时执行passport和presentation任务。 你可以偷偷溜走,你的位置由你的助手保管。 你都可以在演示文稿中工作。

回到计算机科学中: 计算世界中的,通常是 case-1,比如中断处理。

Case-2当只有一个处理器,但所有执行任务都有等待时间由于i/o 。

Case-3通常被认为当我们谈论map-reduce或hadoop集群。

我认为case-4很罕见,它很少发生,任务是并发的,但不是并行的。 但这可能会发生,因为说你的任务需要访问一个特殊的计算芯片,它只能通过processor-1访问。 因此,即使processor-2是自由的并且processor-1正在执行其他任务,特殊的计算任务不能在processor-2上继续。

Case-5,也很少,但不像case-4那么罕见。 non-concurrent代码可以是由互斥体保护的关键区域。 一旦启动,它必须完全执行。 然而,两个不同的关键区域可以同时在两个不同的处理器上进行。

Case-6: 在大多数情况下,当我们谈论并行或者并行编程时,我们基本上讨论的是最后一个Case-6混合和并发执行的最后一个。

并发去:如果你明白为什么robpike说并发性更好,原因是你必须明白,你有一个很长的任务,其中有多个等待时间,等待一些外部操作,比如文件阅读,网络下载。 在他的演讲中,他说的只是打破了这个长的连续任务,这样你可以在等待时做一些有用的事情。 这就是为什么他谈论不同的gophers的不同组织。 现在,go的力量来自于使用"转到"关键字和频道来打破这一点。 运行时也有极好的底层支持来调度这些 goroutine 。

但本质上,并行比并行更好?

苹果比桔子多?

并发:如果两个或者多个问题由单个处理器解决,则为alt text

并行:如果一个问题由多个处理器解决,则为

alt text

concurency: 有可能共享资源的多个执行流

两个线程竞争一个i/o 端口。

paralelism: 在多个相似块中拆分问题。

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

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

并行解决了寻找足够任务和适当任务( 可以正确拆分的)的问题,并将它们分布在大量的CPU资源上。 并行性当然已经存在,但是它正处于前沿,因为multi-core处理器非常廉价。

并发 => 当多个任务同时执行共享资源。

当单个任务划分为多个简单独立的独立任务时,并行 => 。

将它看作服务队列,服务器只能在一个队列中服务 1的作业。

1 服务器,1作业队列( 有 5个作业) -> 没有并发,没有并行性( 只有一个作业正在被服务完成,队列中的下一个作业需要等待,没有其他服务器可以服务)

1 服务器,2或者更多不同的队列( 每个队列有 5个作业) -> 并发( 由于服务器正在共享队列中所有 1个作业的时间,同样或者加权),因为在任何时刻都没有并行性,只有一个任务正在被服务。

2 或者更多的服务器,一个队列-> 并行性( 在同一时刻完成 2个任务) 但没有并发( 服务器没有共享时间,3个任务必须等待一个服务器完成。)

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

换句话说,并发是完成一个任务的时间,它可能会占用同样的时间来完成它的工作,但至少它会提前开始。 重要的是,作业可以被分割成更小的作业,这允许交织。

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

请记住,如果资源是共享的,则无法实现纯并行,但这是并发的最佳实践,而另一个不需要该资源的作业。

我将提供一个与一些流行答案冲突的答案。 在我看来,并发是一个包含并行性的通用术语。 并发适用于不同任务或者工作单元在时间上重叠的任何情况。 并行适用于在同一物理时间计算/执行不同工作单元的情况。 并行的原因etre正在加速可以从多个物理计算资源获益的软件。 另一个适合并发的主要概念是交互。 当从外部观察任务重叠时应用交互 。 交互性d etre of的目的是制作能够响应现实实体如用户,网络对等点,硬件外设等的软件。

并行和交互几乎是完全独立的并发维度。 对于一个特定的项目开发人员来说,他们可能都会关心,或者两者都不管。 它们趋向于被合并,而不是因为那些讨厌的线程给了一个相当方便的原语来做两个。

对并行更多细节:

并行以很小的比例存在( 例如。 处理器中的instruction-level并行性( 例如中等规模) 。 多核处理器和大规模( 例如。 高性能计算集群。由于多核处理器的增长,软件开发人员暴露更多thread-level并行性的压力最近几年增加了。 并行性与依赖的概念紧密相连。 依赖性限制了实现并行的程度;如果一个任务依赖于另一个( 忽略推测),则不能并行执行两个任务。

程序员用来表示并行性的模式和框架很多: 数据结构中的管道,任务池,聚合操作("并行数组") 。

关于互动更多细节:

进行交互的最基本和最常见的方式是使用事件( 例如 。 事件循环和处理程序/回调) 。 对于简单的任务,事件是非常重要的。 尝试使用事件进行更复杂的任务会进入堆栈撕裂( a 。k 。 回调地狱;a.k. 控制反转。 当你对事件感到厌烦时,你可以尝试一些更奇特的东西,比如生成器,协同程序,。 异步/等待),或者协作线程。

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

Curmudgeonliness

我不喜欢 Rob"pike的并发不是并行性;它更好"标语。 并发既不更好也不如并行性。 并发包括不能以并行方式更好或者更糟糕的方式进行比较的交互。 就像说"控制流比数据好"。

...