在学习多线程/进程编程时,我们经常会遇到并发和并行这两个名词,它们看起来是一个概念,都是“多个线程/进程同时执行”的意思,但实际上它们是有区别的,甚至说不是一码事。

很多教材也都解释了并发和并行的区别,例如:

  • 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

不过这种解释非常晦涩难懂,估计只有作者自己才能搞明白。这篇文章,我将站在一个大龄程序员的视角,使用通俗易懂的语言来重新剖析并发和并行的区别,并配上优雅的图片,以加深读者的理解。

并发(Concurrency)

早期计算机的 CPU 都是单核的,一个 CPU 在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU 只能执行完一个再执行下一个。

为了表述简单,下文我们将不再区分进程和线程,而将它们统一称为“任务”。在不同的场景下,一个任务可能是进程,也可能是线程。

计算机在运行过程中,有很多指令会涉及 I/O 操作,而 I/O 操作又是相当耗时的,速度远远低于 CPU,这导致 CPU 经常处于空闲状态,只能等待 I/O 操作完成后才能继续执行后面的指令。

为了提高 CPU 利用率,减少等待时间,人们提出了一种 CPU 并发工作的理论。

所谓并发,就是通过一种算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,CPU 再回到原来的任务继续执行。

下图展示了两个任务并发执行的过程:

图1:单核 CPU 执行两个任务

虽然 CPU 在同一时刻只能执行一个任务,但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,使得多个任务在视觉上看起来是一起执行的。CPU 的执行速度极快,多任务切换的时间也极短,用户根本感受不到,所以并发执行看起来才跟真的一样。

操作系统负责将有限的 CPU 资源分配给不同的任务,但是不同操作系统的分配方式不太一样,常见的有:

  • 当检测到正在执行的任务进行 I/O 操作时,就将 CPU 资源分配给其它任务。
  • 将 CPU 时间平均分配给各个任务,每个任务都可以获得 CPU 的使用权。 在给定的时间内,即使任务没有执行完成,也要将 CPU 资源分配给其它任务,该任务需要等待下次分配 CPU 使用权后再继续执行。

将 CPU 资源合理地分配给多个任务共同使用,有效避免了 CPU 被某个任务长期霸占的问题,极大地提升了 CPU 资源利用率。

并行(Parallelism)

并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。

多核 CPU 内部集成了多个计算核心(Core),每个核心相当于一个简单的 CPU,如果不计较细节,你可以认为给计算机安装了多个独立的 CPU。

多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行。

例如,同样是执行两个任务,双核 CPU 的工作状态如下图所示:

图2:双核 CPU 执行两个任务

双核 CPU 执行两个任务时,每个核心各自执行一个任务,和单核 CPU 在两个任务之间不断切换相比,它的执行效率更高。

并发+并行

在图2中,执行任务的数量恰好等于 CPU 核心的数量,是一种理想状态。但是在实际场景中,处于运行状态的任务是非常多的,尤其是电脑和手机,开机就几十个任务,而 CPU 往往只有 4 核、8 核或者 16 核,远低于任务的数量,这个时候就会同时存在并发和并行两种情况:所有核心都要并行工作,并且每个核心还要并发工作。

例如一个双核 CPU 要执行四个任务,它的工作状态如下图所示:

每个核心并发执行两个任务,两个核心并行的话就能执行四个任务。当然也可以一个核心执行一个任务,另一个核心并发执行三个任务,这跟操作系统的分配方式,以及每个任务的工作状态有关系。

总结

并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。

单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。

在多核 CPU 中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段。

并发和并行的区别(图解)相关推荐

  1. 操作系统中并发和并行的区别和联系

    多线程中并发和并行有区别吗? 搞不懂并发和并行分别是什么意思? 一文通俗的解释并发和并行的区别和联系. 本人一直以为并发和并行是一个意思,直到偶然从站长公众号上看到了并发和并行的区别一文,因此做个笔记 ...

  2. 转:并发与并行的区别

    转: https://www.jianshu.com/p/b11e251d3dc7 并发:一个处理器同时处理多个任务.(concurrency) 单个cpu逻辑上同时处理多个任务: 并行:多个处理器或 ...

  3. 并发与并行的区别(超级通俗易懂)

    学习多线程的时候会遇到一个名词:并发.这是属于操作系统中的词汇,需要了解并发和并行的区别,从网上搜集了几种说法帮助理解. 一: 并发是指一个处理器同时处理多个任务. 并行是指多个处理器或者是多核的处理 ...

  4. 如何向纯洁的女朋友解释并发与并行的区别?

    原文链接:并发与并行的区别 现在我们都说设计可并行.高并发的程序,而且我们很多时候会在潜意识里觉得自己对并行(Parallelism)和并发(Concurrency)的区别很清楚,但如果要明确的说出二 ...

  5. java并发和并行的区别

    概念: 并发:以交替的方式 利用等待某件事情完成的时间  来做其他事情,轮流执行任务,不一定同时.宏观上同时,微观上依次执行. 并行:在同一时刻,任务同时开始进行,彼此没有依赖关系.多个任务同一时刻同 ...

  6. 多线程并发和并行的区别

    背景  对于java开发从业人员来说,并发编程是绕不开的话题,juc并发包下提供了一系列多线程场景解决方案.  随着jdk1.8的普及,多线程处理问题,除了使用使用线程池(ExecutorServic ...

  7. 并发和并行的区别_多核、多处理器、并发、并行、超线程概念总结

    多核与多处理器 多核( ) 多核处理器就是指单个 CPU 中有多个可执行单元. 如下图所示,单个 CPU 中有两套可执行单元. 多处理器( ) 多处理器系统则是一个拥有多个 CPU 的系统.每个 CP ...

  8. 程序与进程的区别,并发与并行的区别,多进程的实现原理

    目录 1. 什么是进程 2. 进程与程序的区别 3. 并发与并行 4. 同步\异步and阻塞\非阻塞(重点) 5. 进程的创建(了解) 6. 进程的终止(了解) 7. 进程的层次结构 8. 进程的状态 ...

  9. 简单了解线程和进程、多进程和多线程、并发和并行的区别

    一:线程与进程 1.概念 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位. 进程:是资源分配的基本单位.一个进程包括多个线程. 2.区别: 1.线程与资源分配无关,它属 ...

  10. 纠错--并发和并行的区别

    并行性和并发性是既相似又有区别的两个概念,再开始分析之前,我们先给出并发和并行的概念. ​ 并行是指两个或多个事件在同一时刻发生. ​ 并发是指两个或多个事件在同一时间间隔内发生. ​ 大家看到的图一 ...

最新文章

  1. 【安全运维】 linux 系统账户,网络,简易安全加固方案(第一部分),经测试可行...
  2. 求 1 到 n 的所有数的约数和
  3. 口红竟超10000款,IT直男谁来拯救?(文末有惊吓)
  4. 【知识图谱】知识融合
  5. vue 修改favicon
  6. selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...
  7. redis sds的申请扩容源码
  8. 详解vue动画的封装
  9. 关于循环经济的三维展示
  10. 一页纸商业计划书 (Business Plan) 模板(转载)
  11. 2018中国企业云计算应用现状及需求调研报告
  12. python的分号用英文还是中文_Python中的分号
  13. Python3 - seaborn: lmplot(), hue, scattr_kws{}, aspect, height
  14. 相机帧率与曝光的关系
  15. AAM和CCM学习笔记
  16. mysql 存储过程 sqlyog_sqlyog写mysql存储过程
  17. html图片颜色变深,利用CSS改变图片颜色的100种方法!
  18. 计算机视觉——SIFT特征提取与检索
  19. 「BJOI 2019」奥术神杖
  20. tf.nn.xw_plus_b()

热门文章

  1. Android新浪微博实训报告,完成一份新浪微博目标用户分析报告
  2. 五年饮冰,难凉热血”,一名专科生的求学历程
  3. QPS,TPS,RT是什么?
  4. 抖音小程序Tiktok开发教程之 基础组件 04 icon 图标组件
  5. WPS2019 装完图片默认打开方式改了, 改成了 WPS 打开
  6. phpnow搭建本地网站服务器,phpnow搭建本地网站服务器
  7. c r 语言教程,R语言初级教程
  8. cad导入mysql_CAD插入一个数据库
  9. 关于bss段的一些思考
  10. 知识图谱-知识体系与知识融合-实体消歧