并发和并行之间的区别是什么?
当前回答
简单地说,并发就是同时处理很多事情。
“处理”一词用粗体显示了并发和并行之间的区别。同时处理许多事情意味着同时完成许多事情,但它们是否同时执行并不重要。另一方面,并行意味着同时做很多事情(同时执行)。因此,可以使用一个或多个处理资源来实现并发上下文。使用一个处理资源同时处理许多事情意味着通过在任务之间进行上下文切换,可以同时执行许多事情。另一方面,具有许多处理资源的并发上下文意味着进行并行处理。这意味着我们通过并行来实现并发,但反之亦然。
在我的文章中,您可能想了解更多关于并发性和并行性及其与当今技术的关系。
其他回答
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
我将尝试用一个有趣且易于理解的示例进行解释。:)
假设一个组织组织了一场国际象棋比赛,10名棋手(棋艺相同)将挑战一名职业冠军棋手。由于国际象棋是一场1:1的比赛,因此组织者必须以高效的方式进行10场比赛,以便尽快完成整个比赛。
希望以下场景能够轻松描述进行这10场比赛的多种方式:
1) 串行-让我们假设专业人员与每个人逐一进行游戏,即与一个人开始和结束游戏,然后与下一个人开始下一场游戏,依此类推。换句话说,他们决定按顺序进行游戏。因此,如果一场比赛需要10分钟才能完成,那么10场比赛将需要100分钟,同样假设从一场比赛到另一场比赛的过渡需要6秒,那么对于10场比赛,则需要54秒(约1分钟)。
因此整个活动将在101分钟内完成(最差进场)
2) 同时-让我们假设职业球员轮到下一个球员,所以所有10名球员同时上场,但职业球员不是一次两个人,他轮到下一个人上场。现在假设一名职业球员需要6秒才能轮到他,而一名职业选手与两名选手的转换时间为6秒,那么回到第一名选手的总转换时间为1分钟(10x6秒)。因此,当他回到第一个与他一起开始比赛的人身边时,已经过去了2分钟(10xtime_per_turn_by-campion+10xtransition_time=2分钟)
假设所有玩家都需要45秒才能完成他们的回合,那么根据SERIAL事件的每场10分钟,游戏结束前的回合数应为600/(45+6)=11回合(约)
因此,整个事件将在11xtime_per_turn_by-player_&_champion+11xtransition_time_across_10_players=11x51+11x60sec=561+660=1221sec=20.35min(大约)内完成
从101分钟提高到20.35分钟(更好的方法)
3) 平行-假设组织者获得了一些额外的资金,因此决定邀请两名职业冠军选手(两人能力相同),并将同一组10名选手(挑战者)分成两组,每组5人,并将他们分配给两名冠军,即每组一人。现在,赛事在这两组比赛中并行进行,即至少有两名选手(每组一名)与各自组的两名职业选手进行比赛。
然而,在该组中,职业选手一次只带一名选手(即按顺序),因此无需任何计算,您可以很容易地推断出整个比赛将在101/2=50.5分钟内完成
看到从101分钟到50.5分钟的进步(好方法)
4) 并发+并行-在上述场景中,假设两名冠军选手将与各自组中的5名选手同时比赛(读第二分),因此现在跨组的比赛是并行运行的,但在组内,他们是同时运行的。
因此,一组游戏将在11xtime_per_turn_by-playerer_&_champion+1extransition_time_across_5_layers=11x51+11x30=600+330=930秒=15.5分钟(大约)内完成
因此,整个活动(包括两个这样的平行跑步组)大约将在15.5分钟内完成
看到从101分钟到15.5分钟的改进(最佳方法)
注意:在上述场景中,如果您用10个类似的工作替换10个玩家,用两个CPU核心替换两个职业玩家,则以下顺序仍然正确:
串行>并行>并发>并发+并行
(注意:此顺序可能会因其他情况而改变,因为此顺序高度依赖于作业之间的相互依赖性、作业之间的通信需求以及作业之间的转换开销)
这篇惊人的博客节选:
并发和并行之间的区别:并发是指两个任务可以在重叠的时间段。并行性是指任务在例如在多核处理器上。并发是独立执行进程的组成,而并行是同时执行(可能相关)计算。并发是指同时处理许多事情。相似一次做很多事情。应用程序可以是并发的,但不能是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行。应用程序可以是并行的,但不能是并发的,这意味着它在多核CPU中同时处理一个任务的多个子任务时间应用程序既不能并行,也不能并发,这意味着它一次一个地、顺序地处理所有任务。应用程序既可以是并行的,也可以是并发的,这意味着它在多核CPU中同时处理多个任务时间
“并发”是指有多件事情正在进行。
“并行性”是指并发的事情同时进行。
没有并行性的并发示例:
单个内核上有多个线程。Win32消息队列中有多条消息。MARS连接上有多个SqlDataReader。浏览器选项卡中有多个JavaScript承诺。
然而,请注意,并发性和并行性之间的区别通常是一个视角问题。从执行代码(可观察到的效果)的角度来看,上述示例是非并行的。但即使在单个内核中也存在指令级并行性。有一些硬件与CPU并行工作,然后在完成时中断CPU。在执行窗口过程或事件处理程序时,GPU可能正在绘制到屏幕。当您仍然获取上一个查询的结果时,DBMS可能正在为下一个查询遍历B树。执行Promise.resolve()时,浏览器可能正在进行布局或联网。等等。。。
好了。世界一如既往地混乱;)
并发是并行的广义形式。例如,并行程序也可以称为并发程序,但反向不成立。
可以在单个处理器上并发执行(多个线程,由调度器或线程池管理)在单个处理器上无法并行执行,但在多个处理器上无法。(每个处理器一个进程)分布式计算也是一个相关的主题,它也可以被称为并发计算,但反过来却不是,就像并行一样。
有关详细信息,请阅读本研究论文并行编程的概念