一文读懂并发与并行

一文读懂并发与并行

作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
翻译: 潘深练的个人网站 如您有更好的翻译版本,欢迎 ❤️ 提交 issue 或投稿哦~
更新: 2022-02-23

并发性和并行性通常用于与多线程程序相关的,最早并发性和并行性似乎指的是相同的概念,但其实并发和并行实际上有不同的含义。在这个并发与并行教程中,我将解释这些概念的含义。

为了清楚起见,在本文中,我讨论在单个应用程序(单个进程)中的并发性和并行性。不在多个应用程序、进程或计算机之间。

并发与并行教程视频

如果您喜欢视频,这里有本教程对应的视频版本: 并发与并行教程视频

一文读懂并发与并行

什么是并发

并发是指在一个应用程序中同时存在多个任务在执行,同时刻或者说看起来是同一时刻(并发)。

如果计算机只有一个CPU,应用程序可能不会在同一时间完成多个任务,但在应用程序内部一次完成多个任务。要同时在多个任务上取得进展,CPU会在执行期间在不同的任务之间切换。如下图所示:

一文读懂并发与并行

什么是并行执行

并行执行是指计算机具有多个 CPU 或 CPU 内核,并同时在多个任务上取得进展。但是,并行执行并不是指与并行性相同的现象 。稍后我将回到并行性。并行执行如下图所示:

一文读懂并发与并行

并行并发执行

可以进行并行并发执行,其中线程分布在多个 CPU 中。因此,在同一个 CPU 上执行的线程是并发执行的,而在不同 CPU 上执行的线程是并行执行的。下图说明了并行并发执行。

一文读懂并发与并行

理解并行性

并行性意味着一个应用程序将其任务拆分成更小的子任务,这些子任务可以并行处理,例如在多个CPU上同时处理。因此,并行性并不是指与并行执行相同的执行模型,即使它们表面上看起来很相似。

为了实现真正的并行性,您的应用程序必须运行多个线程,每个线程必须在单独的 CPU/CPU 内核/显卡 GPU 内核或类似内核上运行。

下图显示了一个更大的任务,它被分为4个子任务。这4个子任务由4个不同的线程执行,它们运行在2个不同的CPU上。这意味着,这些子任务的部分是并行执行的(在同一CPU上执行的),而部分是并行执行的(在不同CPU上执行的)。

一文读懂并发与并行

如果这4个子任务由4个线程在各自的CPU上执行(总共4个CPU),那么任务的执行将是完全并行的。然而,要将一个任务分解成与可用CPU数量一样多的子任务并不总是那么容易。通常,将一个任务分解为多个子任务更容易,这些子任务与手头的任务自然匹配,然后让线程调度器负责在可用CPU之间分配线程。

并发和并行组合

综上所述,并发性指的是多个任务在单个CPU上看似同时取得进展。

另一方面,并行性与应用程序如何并行执行单个任务有关,通常是通过将任务拆分为可以并行完成的子任务。

这两种执行方式可以在同一个应用程序中组合。我将在下面介绍其中一些组合。

并发,非并行

应用程序可以是并发的,但不能是并行的。这意味着它似乎同时(同时)在多个任务上取得进展,但应用程序会在每个任务上取得进展之间切换,直到任务完成。在并行线程/CPU中没有真正的任务并行执行。

并行,不并发

应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,而这个任务被分解成可以并行处理的子任务。但是,每个任务(+子任务)都是在下一个任务被拆分并并行执行之前完成的。

既不并发也不并行

此外,应用程序既不能是并发的,也不能是并行的。这意味着它一次只能处理一个任务,而且任务永远不会分解为并行执行的子任务。小型命令行应用程序可能就是这种情况,因为它只有一个作业,太小了,无法并行化。

并发且并行

最后,应用程序还可以通过两种方式同时并发和并行:

第一种是简单的并行执行。如果应用程序启动多个线程,然后在多个CPU上执行,就会发生这种情况。

第二种方式是应用程序同时处理多个任务,并将每个任务分解为子任务,同时以并行的方式执行。但是在这种情况下,并发和并行的一些性能优势可能会丢失,因为计算机中的 CPU 基于在频繁于并发或并行处理。所以并发且并行,可能只会带来微小的性能提升甚至可能是性能损失。因此,除非有特殊目的并且已经提前进行了充分分析和测量,否则不建议采用并发并行模型。

(本篇完)

作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
翻译: 潘深练的个人网站 如您有更好的翻译版本,欢迎 ❤️ 提交 issue 或投稿哦~
更新: 2022-02-23

Original: https://www.cnblogs.com/panshenlian/p/16068584.html
Author: 潘潘和他的朋友们
Title: 一文读懂并发与并行

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608842/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux系统(根目录下)目录介绍

    Linux系统(根目录下)目录介绍根目录(/)包含了几乎所的文件目录。相当于中央系统。进入的最简单方法是:cd /。★/boot 引导程序,内核等存放的目录这个目录,包括了在引导过…

    Java 2023年6月7日
    073
  • DataGrip连接Mysql报08S01解决方案

    以前正常使用的GataGrip,突然在某天报下面的错误提示:08S01 [08S01] Communications link failure The last packet se…

    Java 2023年6月13日
    065
  • 日落西风又在吹

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/SimpleWu/p/16718231.htmlAuth…

    Java 2023年6月5日
    086
  • Windows安装jdk1.8和配置环境变量

    Original: https://www.cnblogs.com/qtiger/p/15986266.htmlAuthor: 搬砖滴Title: Windows安装jdk1.8和…

    Java 2023年5月30日
    061
  • Java8 提供的函数接口

    参考资料 函数接口 Java 提供的函数接口位于 java.util.function 包下。 接下来介绍主要的函数接口: Function 接口代表一个 接收1个参数并返回1个结…

    Java 2023年6月9日
    050
  • Java如何实现消费数据隔离?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看…

    Java 2023年6月9日
    065
  • 解决mysq服务无法正常启动问题

    在mysql的启动过程中,遇到什么问题都可以反馈给我,我都会尽力帮你们解决 第一种:通过net start mysql启动MySQL服务器时,出现以下信息 是因为在MySQL5.7…

    Java 2023年6月9日
    076
  • SpringBoot Bean指定初始化顺序详解

    转自:https://blog.csdn.net/zzhongcy/article/details/109504563 最近遇到SpringBoot容器外类初始化依赖容器内bean…

    Java 2023年5月30日
    0121
  • 模板化的封装,降低业务代码开发

    复杂的问题,往往需要简单的逻辑; 一、业务背景 业务开发是一件复杂且耗时的工程,所以最近几年出了一个很火的概念叫做”低代码”开发,简单的说就是开发人员通过简…

    Java 2023年6月15日
    081
  • 整理了一份最全的Java学习视频资源,附带学习路线

    整理了一些 B 站的编程视频分享给大家。 分享之前,先说明一下: 以下视频都是播放量和点赞多的,评价好的视频。 我写的这个顺序,就是一份学习路线,可以直接照着学。 有的一个内容里有…

    Java 2023年6月7日
    073
  • 系统性掌握SpringBoot

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/franson-2016/p/13320880.html…

    Java 2023年5月30日
    071
  • git 常用操作

    可以把分支名理解为指针,比如 master,test,origin/master 等,都是一个指针,指向某次提交快照特殊指针HEAD:Git有一个名为 HEAD 的特殊指针,它是一…

    Java 2023年6月9日
    094
  • mybatis整合springboot 以及需要注意的细节

    具体怎么整合的网上有很多优秀的博客介绍,这里就直接引用一篇个人觉得非常详细的教程: https://blog.csdn.net/winter_chen001/article/det…

    Java 2023年6月5日
    088
  • Cnblogs-Theme-SimpleMemory 定制分享

    配置文件 这是我个人参考官方的配置指南根据自己的需求配置的, 部分功能添加后效果不理想故而注释 用户图像横幅图片,推荐下载保存到本地然后上传到 Github 再用此连接。 防止日后…

    Java 2023年6月5日
    070
  • Java 反射机制

    基本概念 在Java 运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是 肯定的。 这种动态获取类的信息以及动态调用…

    Java 2023年5月29日
    073
  • Docker内使用Nignx

    //下载镜像 docker pull nginx 运行镜像: default.conf是配置server块的地方,将其映射到本地方便修改 docker run -d -p 80:8…

    Java 2023年6月5日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球