并发和并行之间的区别是什么?
当前回答
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
其他回答
它们解决不同的问题。并发性解决了CPU资源稀缺和任务多的问题。因此,您可以通过代码创建线程或独立的执行路径,以便在稀缺资源上共享时间。直到最近,由于CPU的可用性,并发性一直是讨论的焦点。
并行性解决了找到足够的任务和适当的任务(可以正确分割的任务)并将它们分配到大量的CPU资源上的问题。当然,并行性一直都存在,但由于多核处理器非常便宜,所以它正走到最前沿。
并行性是每个CPU或多个CPU(在单个主板上)在多个内核上同时执行进程。
并发是指通过使用划分CPU时间(时间片)的调度算法在单个内核/CPU上实现并行性。进程是交错的。
单位:单个CPU中有1个或多个内核(几乎所有现代处理器)主板上有1个或多个CPU(想想老式服务器)一个应用程序就是一个程序(想想Chrome浏览器)一个程序可以有一个或多个进程(认为每个Chrome浏览器选项卡都是一个进程)一个进程可以有一个程序中的一个或多个线程(Chrome选项卡在一个线程中播放Youtube视频,另一个线程生成评论部分,另一个用于用户登录信息)因此,一个程序可以有一个或多个执行线程1个进程是线程+OS分配的内存资源(堆、寄存器、堆栈、类内存)
太好了,让我用一个场景来展示我的理解。假设有三个孩子:A,B,C。A和B说话,C听。对于A和B,它们是平行的:A: 我是A。B: 我是B。
但对于C来说,他的大脑必须同时进行听A和B的过程,这可能是:我是我A是B。
为什么存在困惑
由于这两个词的字典含义几乎相同,因此存在混淆:
并发:同时存在、发生或完成(dictionary.com)平行:非常相似,经常同时发生(梅里亚姆·韦伯斯特)。
然而,它们在计算机科学和编程中的使用方式却截然不同。以下是我的解释:
并发性:可中断性并行性:独立性
那么,我所说的上述定义是什么意思?
我将用一个现实世界的类比来澄清。假设你必须在一天内完成两项非常重要的任务:
获取护照完成演示文稿
现在,问题是任务1需要你去一个极其官僚的政府办公室,这让你排队等候4个小时才能拿到护照。同时,任务2是你的办公室需要的,这是一项关键任务。两者都必须在特定的一天完成。
案例1:顺序执行
通常,你会开车去护照办公室2个小时,排队4个小时,完成任务,开车回去两个小时,回家,再睡5个小时,然后完成演讲。
案例2:并发执行
但你很聪明。你要提前计划。你随身携带一台笔记本电脑,在排队等候的时候,你开始做你的演讲。这样,一旦你回到家里,你只需要额外工作1小时而不是5小时。
在这种情况下,这两项任务都是由您完成的,只是零碎的。您在排队等候时中断了护照任务,并进行了演示。当您的号码被呼叫时,您中断了演示任务,并切换到护照任务。由于这两项任务的可中断性,节省时间基本上是可能的。
并发性,IMO,可以理解为ACID中的“隔离”属性。如果子事务可以以任何交错的方式执行,那么两个数据库事务被认为是隔离的,并且如果两个任务是顺序完成的,那么最终结果是相同的。记住,对于护照和演示任务,你是唯一的刽子手。
案例3:并行执行
现在,既然你是个聪明的家伙,你显然是个更高级的人,而且你有一个助手。所以,在你开始护照任务之前,你给他打电话,告诉他准备演示文稿的初稿。你花了一整天的时间完成护照任务,回来看看你的邮件,然后找到了演示稿。他做得很扎实,再过两个小时就完成了一些编辑。
现在,你的助手和你一样聪明,他能够独立工作,而不需要经常要求你澄清。因此,由于任务的独立性,它们由两个不同的执行者同时执行。
还和我在一起吗?好吧
案例4:并行但不并行
还记得你的护照任务吗,你必须在排队等候的地方?因为这是你的护照,你的助手不能排队等你。因此,护照任务具有可中断性(您可以在排队等候时停止它,稍后当您的号码被呼叫时再继续),但没有独立性(您的助手不能代替您等待)。
案例5:并行但不并发
假设政府办公室有一个安全检查来进入办公场所。在这里,您必须移除所有电子设备并将其提交给官员,他们只会在您完成任务后归还您的设备。
在这种情况下,护照任务既不可独立,也不可中断。即使你在排队,你也不能做其他事情,因为你没有必要的设备。
同样地,假设演示是高度数学化的,你需要100%集中至少5小时。你不能在排队等候护照任务时做这件事,即使你随身携带笔记本电脑。
在这种情况下,演示任务是独立的(您或您的助手可以投入5小时的精力),但不能中断。
案例6:并发和并行执行
现在,假设除了指派你的助手参加演示外,你还随身携带一台笔记本电脑来完成护照任务。在排队等候时,您会看到您的助手在共享幻灯片组中创建了前10张幻灯片。你对他的工作发表了评论,并做了一些更正。后来,当你回到家时,你只需要15分钟,而不是2个小时来完成草稿。
这是可能的,因为演示任务具有独立性(你们中的任何一个都可以完成)和可中断性(你们可以停止它,稍后再继续它)。因此,您同时执行了两个任务,并并行执行了演示任务。
比方说,除了过于官僚之外,政府办公室也是腐败的。因此,你可以出示你的身份证,输入它,开始排队等待你的号码被呼叫,贿赂一名警卫和其他人来保持你在队伍中的位置,偷偷溜出去,在号码被呼叫之前回来,然后自己继续等待。
在这种情况下,您可以同时并行执行护照和演示任务。你可以偷偷溜出去,你的位置由你的助手掌握。然后你们两个都可以进行演示等。
回到计算机科学
在计算世界中,以下是每种情况的典型场景:
情况1:中断处理。情况2:只有一个处理器,但由于I/O,所有正在执行的任务都有等待时间。案例3:当我们谈论map reduce或hadoop集群时经常会看到。案例4:我认为案例4很罕见。任务是并发但不是并行的,这是不常见的。但这可能会发生。例如,假设您的任务需要访问只能通过处理器1访问的特殊计算芯片。因此,即使处理器-2是空闲的,而处理器-1正在执行其他任务,特殊计算任务也不能在处理器-2上继续。病例5:同样罕见,但不像病例4那样罕见。非并发代码可以是受互斥锁保护的关键区域。一旦启动,它必须执行到完成。然而,两个不同的关键区域可以在两个不同处理器上同时进行。案例6:IMO,关于并行或并发编程的大多数讨论基本上都在讨论案例6。这是并行和并发执行的混合和匹配。
并发和Go
如果你明白Rob Pike为什么说并发性更好,你必须明白原因是什么。你有一个非常长的任务,其中有多个等待期,你需要等待一些外部操作,如文件读取、网络下载。在他的演讲中,他所说的是,“把这一长串的任务分解,这样你就可以在等待的时候做一些有用的事情。”这就是为什么他会和各种各样的地鼠谈论不同的组织。
现在,围棋的力量来自于使用围棋关键词和频道,让这一突破变得非常容易。此外,在运行时中有很好的底层支持来调度这些goroutine。
但本质上,并发比并行好吗?
苹果比橙子好吗?
这篇惊人的博客节选:
并发和并行之间的区别:并发是指两个任务可以在重叠的时间段。并行性是指任务在例如在多核处理器上。并发是独立执行进程的组成,而并行是同时执行(可能相关)计算。并发是指同时处理许多事情。相似一次做很多事情。应用程序可以是并发的,但不能是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行。应用程序可以是并行的,但不能是并发的,这意味着它在多核CPU中同时处理一个任务的多个子任务时间应用程序既不能并行,也不能并发,这意味着它一次一个地、顺序地处理所有任务。应用程序既可以是并行的,也可以是并发的,这意味着它在多核CPU中同时处理多个任务时间
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- Thread start()和Runnable run()有什么区别
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- 跳跃表vs.二叉搜索树
- 在Swift中,什么相当于Objective-C的“@synchronized”?
- 是AsyncTask真的概念上有缺陷或我只是错过了一些东西?
- 递归还是迭代?
- Stack Overflow如何生成其seo友好的url ?
- AtomicInteger的实际用途