并发和并行有什么区别?
并发和并行有什么区别?
简单例子:
并发是:"两个队列访问一个ATM机"
并行是:"两个队列和两个ATM机"
它们解决不同的问题。并发性解决了CPU资源稀缺和任务众多的问题。因此,您可以通过代码创建线程或独立的执行路径,以便在稀缺资源上共享时间。直到最近,并发性一直占据讨论的主导地位,因为CPU可用性。
并行性解决了找到足够任务和适当任务(可以正确分割的任务)并在丰富的CPU资源上分配它们的问题。当然,并行性一直存在,但由于多核处理器如此便宜,它正在走向前沿。
并发: 多个执行流同时运行,可能共享资源。
例: 两个线程竞争 I/O 端口。
并行: 将问题分解为多个相似的部分进行处理。
例: 通过在文件的每一半上运行两个进程来解析大文件。
并发 => 当多个任务在共享资源的情况下,可能会最大化资源利用率,在重叠时间段内同时执行。
并行 => 将单个任务分解为多个简单独立的子任务,可以同时执行。
并发 vs 并行
在Rob Pike的视频演讲 《Concurrency Is Not Parallelism》 中:
并发是同时处理多个任务。
并行是同时执行多个任务。
并发 - 处理多个任务
并行 - 同时处理多个线程
我的并发和并行的视觉表达为:
把它想象成服务队列,服务器只能服务于队列中的第一个任务。
1个服务器,1个作业队列(有5个作业)->没有并发性,也没有并行性(只有一个作业被完整地服务,队列中的下一个作业必须等待已处理的作业完成,并且没有其他服务器可以为其提供服务)
1个服务器,2个或更多不同的队列(每个队列都有5个作业)->并发性(因为服务器与所有队列中的第一个作业共享时间,平等或加权),但仍然没有并行性,因为在任何时刻,只有一个作业正在被服务。
2个或多个服务器,一个队列->并行性(同时完成2项作业),但没有并发性(服务器不共享时间,第三项作业必须等到其中一个服务器完成才能开始执行)
2个或多个服务器,2个或多个不同的队列->并发性和并行性
换句话说,并发性是共享时间来完成作业,可能需要相同的时间来完成作业,但至少可以早些开始。重要的是,作业可以被分成较小的作业,这允许交错。
仅通过更多的CPU、服务器、人员等运行并行程序即可实现并行性。
请记住,如果资源是共享的,则无法实现纯粹的并行性,但这就是并发性具有最佳实际用途的地方,它可以处理不需要该资源的另一个作业。
我非常喜欢保罗·布切尔(Paul Butcher)对这个问题的答案(他是《七周七并发模型》一书的作者):
虽然并行和并发经常被混淆,但它们是不同的东西。并发是问题域的一个方面——你的代码需要处理多个同时(或几乎同时)发生的事件。相比之下,并行是解决方案领域的一个方面——你想通过并行处理问题的不同部分来使程序运行更快。一些方法适用于并发,一些适用于并行,还有一些同时适用于两者。了解你所面临的问题并选择正确的工具来完成工作。
来自 Robert Love 的书籍《Linux 系统编程》:
并发、并行和竞态
线程创建了两个相关但不同的现象:并发和并行。这两者都是双刃剑,涉及到线程的成本以及它的好处。并发是两个或多个线程在重叠的时间段内执行的能力。并行是同时执行两个或多个线程的能力。并发可以在没有并行的情况下发生,例如在单处理器系统上进行多任务处理。并行(有时强调为真正的并行)是一种特定形式的并发,需要多个处理器(或者具有多个执行引擎的单个处理器,例如 GPU)。在并发中,多个线程推进,但不一定是同时的。而在并行中,线程确实是并行执行的,允许多线程程序利用多个处理器。
并发是一种编程模式,一种解决问题的方法。并行是硬件特性,通过并发可实现。两者都是有用的。
这个解释与所接受的答案一致。实际上,这些概念比我们想象的要简单得多。不要将它们看作是魔法。并发是关于一段时间的,而并行则是关于同时、并且具有同时性。