Parallelism Vs Concurrency

原创
2019/01/06 18:13
阅读数 123

这是两个英文解释边界都很模糊的单词,翻译到中文里就更让人满头雾水了。网友对这两个词的解释也是各执一词,网友在Stack Overflow 上也问过这个问题What is the difference between concurrency and parallelism?, 排名最高的解释与我们平常接收到的一致:Parallelism(并行) 表示多个任务在同一时间同时运行,并发表示多个任务可以在不同的时间片上执行,但某一个时刻可以只有一个任务运行。在我看来这个定义的给人的感觉区别就在于CPU 是单核还是多核,没有什么价值。二楼的网友给出了parallelism 和 concurrency 之间不同的关键特征:Parallelism: Independentability, Concurrency: Interruptability, 并举了四种情况的例子。

关键是这两个单词对我们的开发有什么指导意义呢?从字面含义上来看完全没有头绪,我们设计程序时如果牵扯到多线程编程该以哪个为指导呢?或者两者都需要考虑?(并发编程字面上含有并发,但为何如此?并行就不需要考虑了么?)

Haskell 在wiki里对这两者有过一篇文章, 里面给出了解释:The term Parallelism refers to techniques to make programs faster by performing several computations at the same time. The term Concurrency refers to techniques that make programs more usable. 并行是为了提升计算速度的技术,而并发是为了使程序更合用。If you run distributed-net computations in the background while working with interactive applications in the foreground, that is concurrency. On the other hand, dividing a task into packets that can be computed via distributed-net clients is parallelism.. Go 的发明者 Rob Pike 曾对这个做过一个 presentation Concurrency is not parallelism, 他将 concurrency 当做指导我们编程的准则,也就是他说的Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once. 我们需要将任务一步步分解开来,在脑海中描绘完成任务所需的步骤,每一步可以是独立的也可以依赖其他的步骤。当我们将任务步骤完成后,这个整体可以拷贝复制很多份并行执行。

在单机编程中,线程是最小的执行单位,在这个维度上我们只考虑并发对我们的影响,因为执行是不太需要我们关心的,OS 可以自己做好调度。在分布式系统中,单台机器变成了最小的单位,我们不仅要考虑并发,还需要考虑并行。一堆任务如何分解成一系列步骤,步骤之间可能是相互依赖的,这是并发维度;这一堆任务分成不同的组,任务之间是可以并行执行的,还需要考虑调度问题。因此并发和并行对于思维的要求是不一样的,这也是我们在面对问题时的两种解决思路。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部