并发和并行之间的区别是什么?
当前回答
只是为了给其他好答案添加更多的澄清:
基于处理的抽象(CPU作为一个完全可以想象的例子)能够在同一时刻运行唯一的任务的前提,
并发是一个关于处理抽象的故事:它可以在不同的任务之间切换。
并行是一个关于我们有多个处理抽象的故事(例如,我们的CPU有多个内核)。因此,这是我们的系统能够同时执行多个任务的原因(字面意思)。但这里没有提到处理的特定抽象(它们是否并发)。
这里的重点是这些故事的内容。
因此,当您阅读公认答案时,请注意:
并发是指两个或多个任务可以在重叠的时间段。
严格地说,我们可以根据这个定义得出结论,并行性本身就是并发性的前提。
其他回答
并行性是每个CPU或多个CPU(在单个主板上)在多个内核上同时执行进程。
并发是指通过使用划分CPU时间(时间片)的调度算法在单个内核/CPU上实现并行性。进程是交错的。
单位:单个CPU中有1个或多个内核(几乎所有现代处理器)主板上有1个或多个CPU(想想老式服务器)一个应用程序就是一个程序(想想Chrome浏览器)一个程序可以有一个或多个进程(认为每个Chrome浏览器选项卡都是一个进程)一个进程可以有一个程序中的一个或多个线程(Chrome选项卡在一个线程中播放Youtube视频,另一个线程生成评论部分,另一个用于用户登录信息)因此,一个程序可以有一个或多个执行线程1个进程是线程+OS分配的内存资源(堆、寄存器、堆栈、类内存)
这篇惊人的博客节选:
并发和并行之间的区别:并发是指两个任务可以在重叠的时间段。并行性是指任务在例如在多核处理器上。并发是独立执行进程的组成,而并行是同时执行(可能相关)计算。并发是指同时处理许多事情。相似一次做很多事情。应用程序可以是并发的,但不能是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行。应用程序可以是并行的,但不能是并发的,这意味着它在多核CPU中同时处理一个任务的多个子任务时间应用程序既不能并行,也不能并发,这意味着它一次一个地、顺序地处理所有任务。应用程序既可以是并行的,也可以是并发的,这意味着它在多核CPU中同时处理多个任务时间
摘自Robert Love的《Linux系统编程》一书:
并发、并行和竞争线程创建两个相关但不同的现象:并发和相似两者都是苦乐参半的,涉及线程的成本以及它的好处。并发是两个或两个以上的能力要在重叠的时间段中执行的线程。平行度为同时执行两个或多个线程的能力。并发可以在没有并行性的情况下发生:例如,多任务处理在单处理器系统上。并行性(有时强调为真正的并行性)是一种特殊的并发形式,需要多个处理器(或一个能够支持多个引擎的处理器例如GPU)。通过并发,多个线程可以但不一定同时进行。具有并行,线程实际上并行执行,允许多线程程序以利用多个处理器。并发是一种编程模式,一种解决问题的方法。并行性是一种硬件特性,可以通过并发实现。两者都很有用。
这一解释与公认的答案一致。事实上,这些概念远比我们想象的简单。不要认为它们是魔法。并发大约是一段时间,而并行大约是同时进行的。
并发性=>在共享资源的重叠时间段内执行多个任务时(可能最大化资源利用率)。
并行=>当单个任务被划分为可以同时执行的多个简单的独立子任务时。
并发是并行的广义形式。例如,并行程序也可以称为并发程序,但反向不成立。
可以在单个处理器上并发执行(多个线程,由调度器或线程池管理)在单个处理器上无法并行执行,但在多个处理器上无法。(每个处理器一个进程)分布式计算也是一个相关的主题,它也可以被称为并发计算,但反过来却不是,就像并行一样。
有关详细信息,请阅读本研究论文并行编程的概念
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- Thread start()和Runnable run()有什么区别
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- 跳跃表vs.二叉搜索树
- 在Swift中,什么相当于Objective-C的“@synchronized”?
- 是AsyncTask真的概念上有缺陷或我只是错过了一些东西?
- 递归还是迭代?
- Stack Overflow如何生成其seo友好的url ?
- AtomicInteger的实际用途