并发和并行之间的区别是什么?
当前回答
摘自Robert Love的《Linux系统编程》一书:
并发、并行和竞争线程创建两个相关但不同的现象:并发和相似两者都是苦乐参半的,涉及线程的成本以及它的好处。并发是两个或两个以上的能力要在重叠的时间段中执行的线程。平行度为同时执行两个或多个线程的能力。并发可以在没有并行性的情况下发生:例如,多任务处理在单处理器系统上。并行性(有时强调为真正的并行性)是一种特殊的并发形式,需要多个处理器(或一个能够支持多个引擎的处理器例如GPU)。通过并发,多个线程可以但不一定同时进行。具有并行,线程实际上并行执行,允许多线程程序以利用多个处理器。并发是一种编程模式,一种解决问题的方法。并行性是一种硬件特性,可以通过并发实现。两者都很有用。
这一解释与公认的答案一致。事实上,这些概念远比我们想象的简单。不要认为它们是魔法。并发大约是一段时间,而并行大约是同时进行的。
其他回答
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
并行编程执行有两种类型:非并行并行编程和并行并行编程(也称为并行)。
关键的区别在于,在人类看来,非并行并发中的线程似乎同时运行,但实际上它们并不运行。在非并行并发中,线程通过时间切片快速切换并轮流使用处理器。虽然并行有多个处理器可用,但多个线程可以同时在不同的处理器上运行。
参考文献:编程语言中的并发简介
(我很惊讶这样一个根本问题多年来都没有得到正确和巧妙的解决……)
简而言之,并发性和并行性都是计算的财产。
至于区别,以下是罗伯特·哈珀的解释:
首先要理解的是并行性与并发无关。并发与程序(或其组件)的不确定性组成有关。并行性与具有确定性行为的程序的渐近效率有关。并发是关于管理不可管理的事件:事件的发生是出于我们无法控制的原因,我们必须对此做出反应。用户单击鼠标时,窗口管理器必须做出响应,即使显示需要注意。这种情况本质上是不确定性的,但我们也在确定性设置中采用形式上的不确定性,假装组件以任意顺序发出事件信号,并且我们必须在事件发生时对其作出响应。非确定性组合是一种强大的程序结构思想。另一方面,并行性是关于确定性计算的子组之间的依赖性。其结果毋庸置疑,但有许多方法可以实现,有些方法比其他方法更有效。我们希望充分利用这些机会。
它们可以是程序中的各种正交财产。阅读此博客文章以获取更多插图。这篇文章稍微讨论了编程中组件的差异,比如线程。
注意,线程或多任务都是为更具体的目的服务的计算实现。它们可以与并行性和并发性相关,但不是以一种基本的方式。因此,它们很难成为开始解释的好条目。
还有一个亮点:(物理)“时间”几乎与这里讨论的财产无关。时间只是一种衡量实施的方式,以显示财产的重要性,但远非本质。仔细考虑一下“时间”在时间复杂性中的作用——这或多或少是相似的,即使在这种情况下,度量也往往更重要。
想象一下,通过观看视频教程学习一种新的编程语言。你需要暂停视频,应用代码中所说的内容,然后继续观看。这就是并发性。
现在你是一名职业程序员了。你喜欢在编码时听平静的音乐。这就是平行主义。
正如Andrew Gerrand在GoLang博客中所说
并发是指同时处理许多事情。相似一次做很多事情。
享受
我非常喜欢Paul Butcher对这个问题的回答(他是《七周内的七个并发模型》的作者):
虽然它们经常被混淆,但并行性和并发性是不同的事情。并发性是问题域的一个方面代码需要同时处理多个(或接近同时)事件。相反,并行性是解决方案的一个方面您希望通过处理使程序运行更快的域并行处理问题的不同部分。有些方法是适用于并发,有些适用于并行,有些则适用于两者。了解您面临的问题,并选择合适的工具工作
推荐文章
- foreach和map有区别吗?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- Thread start()和Runnable run()有什么区别
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- 跳跃表vs.二叉搜索树
- 在Swift中,什么相当于Objective-C的“@synchronized”?
- 是AsyncTask真的概念上有缺陷或我只是错过了一些东西?
- 递归还是迭代?
- Stack Overflow如何生成其seo友好的url ?