并发和并行之间的区别是什么?


当前回答

太好了,让我用一个场景来展示我的理解。假设有三个孩子:A,B,C。A和B说话,C听。对于A和B,它们是平行的:A: 我是A。B: 我是B。

但对于C来说,他的大脑必须同时进行听A和B的过程,这可能是:我是我A是B。

其他回答

并发可以涉及同时运行或不同时运行的任务(它们确实可以在单独的处理器/内核中运行,但也可以在“滴答声”中运行)。重要的是,并发总是指完成一项更大任务的一部分。所以基本上这是一些计算的一部分。你必须聪明地知道你可以同时做什么,不可以做什么,以及如何同步。

并行性意味着你只是同时做一些事情。他们不需要参与解决一个问题。例如,您的线程可以分别解决一个问题。当然,同步的东西也适用,但从不同的角度来看。

我将尝试用一个有趣且易于理解的示例进行解释。:)

假设一个组织组织了一场国际象棋比赛,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内核,或者在一个主机内使用共享内存,或者在不同主机上使用分布式内存,以运行并发代码。例如,同时并发运行的3个不同任务的流水线:Task-level-2必须等待Task-level-1完成的单元,而Task-level-3必须等待Task-level-2完成的工作单元。另一个例子是1-生产者与1-消费者的并发;或许多生产者和1-消费者;读者和作家;等

“并行”是指同时做相同的事情。它是并发的,但更重要的是,它是在同一时间发生的相同行为,最典型的是在不同的数据上。矩阵代数通常可以并行化,因为您有重复运行的相同操作:例如,可以使用相同的行为(和)在不同的列上同时计算矩阵的列和。在可用的处理器核之间划分(拆分)列是一种常见的策略,这样每个处理器核处理的工作量(列数)就接近相同。另一种拆分工作的方法是一袋一袋的任务,完成工作的员工会回到经理那里,经理会将工作分配出去,并动态地分配更多的工作,直到所有工作都完成。票务算法是另一种。

不仅仅是数字代码可以并行化。文件太频繁可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每一个,您可能需要计算文档中标记的数量。这是并行的,因为您正在计算每个文件的令牌,这是相同的行为。

换句话说,并行是指同时执行相同的行为。并发意味着同时,但不一定是相同的行为。并行是一种特殊类型的并发,在同一时间发生相同的事情。

例如,术语将包括原子指令、关键部分、互斥、旋转等待、信号量、监视器、屏障、消息传递、map reduce、心跳、铃声、票务算法、线程、MPI、OpenMP。

格雷戈里·安德鲁斯(Gregory Andrews)的著作是关于多线程、并行和分布式编程的顶级教科书。

如果你想向一个9岁的孩子解释这一点。

将其视为服务队列,其中服务器只能服务队列中的第一个作业。

1个服务器,1个作业队列(有5个作业)->无并发,无并行性(只有一个作业被服务完成,队列中的下一个作业必须等待服务完成,并且没有其他服务器为其服务)

1个服务器,2个或多个不同的队列(每个队列有5个作业)->并发(因为服务器与队列中的所有第一个作业共享时间,相等或加权),仍然没有并行性,因为在任何时刻都有一个且唯一的作业在服务。

两个或多个服务器,一个队列->并行(两个作业同时完成),但没有并发(服务器不共享时间,第三个作业必须等待其中一个服务器完成)

2个或多个服务器,2个或更多不同的队列->并发性和并行性

换句话说,并发是共享完成作业的时间,它可能会占用相同的时间来完成作业,但至少它会提前开始。重要的是,可以将作业分割成更小的作业,这样可以进行交织。

并行性是通过更多并行运行的CPU、服务器、人员等实现的。

请记住,如果共享资源,则无法实现纯粹的并行性,但这正是并发性的最佳实际用途,它将承担另一项不需要该资源的工作。