并发

首先并发是一个比较宽泛的概念,它代表计算机能够同时执行多项任务。至于计算机怎么做到“并发”则有许多不同的形式。

比如对于一个单核处理器,计算机可以通过分配时间片的方式,让一个任务执行一段时间然后切换另外一个任务再运行一段时间,不同的任务会这样交替往复的一直执行下去。

这个过程也被称作进程或者线程的上下文切换。


并行

对于多核处理器,情况有所不同。任务可以在不同的核心上真正并行地执行而不用通过分配时间片的方式运行,这也就是我们所说的并行。


至于同步和异步,则是两种不同的编程模型

同步&异步

“同步”代表需要等到前一个任务执行完毕之后才能执行下一个任务,因此在同步中并没有并发或者并行的概念

而异步则代表不同的任务之间并不会相互等待先后执行,也就是说在执行任务A的时候也可以运行任务B

一个典型实现异步的方式则是通过多线程编程

你可以创建多个线程并且启动他们,在多核的环境下,每个线程就会被分配到独立的核心上运行,实现真正的“并行”

如果使用的是单核心处理器,或者通过设置亲和力强制将线程绑定到某个核心上,操作系统则会通过分配时间片来执行这些线程,不过这些线程依然是在“并发”地执行


单线程的“并发”

但像某些编程语言,比如javascript本身是没有多线程的概念的,不过通过它的函数回调(function callback)机制,依然能够做到单线程的“并发”。

比如你可以通过fetch()同时访问多个网络资源
我们在调用fetch()函数的时候,程序并不会等待而会继续执行下去,当获取到网络资源以后回调函数才会被调起

fetch("dog.jpg").then((response) => response.blob()).then(blob) => {addImage(blob);console.log("Image loaded.")});


需要注意的是, 虽然主程序和回调函数看起来是同时进行的,但它们依然是运行在同一个线程中,因此通过这种异步编程方式,我们完全可以做到单线程的“并发”,而且这并不是javascript的专利,很多语言也都提供了原生的异步编程方式,比如 C#,Rust,C++20中的 co_await,Python 中的 asyncio 等等等

那么对于多线程编程和(单线程)异步编程,该如何进行选择呢?

简而言之,对于I/O密集的应用程序,比如 Web 应用就会经常执行网络操作、数据库访问,这类应用就非常适合使用异步编程的方式

反之,如果我们使用多线程的方式,则会浪费不少系统资源

因为每个线程的绝大多数时间都是在等待这些I/O操作,而线程自身会占用额外的内存,线程的切换也会有额外的开销,更不用说线程之间的资源竞争问题。

而多线程编程则非常适合于计算量密集的应用,比如视频图像处理、科学计算等等,它能够让每一个 CPU 核心发挥最大的功效而不是消耗在空闲的等待上

并发并行同步异步的区别相关推荐

  1. 怎样理解阻塞非阻塞与同步异步的区别

    怎样理解阻塞非阻塞与同步异步的区别? 发现很多人对这两个概念往往混为一谈 6 条评论 分享 按投票排序 按时间排序 47 个回答 605赞同 反对,不会显示你的姓名 卢毅 ,Lyft full-sta ...

  2. 一则故事表达:并发,并行,同步,异步,线程,多线程

    一个小事件说明下并发,并行,同步,异步,线程,多线程 一个广交会举办向8间公司发起展览邀请, 参展公司有8间,场地有80万平方米的展示区域, 每个参展商有10万平方米可以用于展出售卖, 每个参展公司仅 ...

  3. ajax同步异步的区别

    ajax同步异步的区别 一.什么是ajax? Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对 ...

  4. 阻塞非阻塞与同步异步的区别?

    之前一直对阻塞非阻塞与同步异步这两对概念理解不深,总是把它们搞混.看了网上一些相关的解释之后,发现大家站在不同的角度得出了不同的理解,这个问题没有确切的答案,只能根据场景不同做出解释. 进程间的通信 ...

  5. 阻塞/非阻塞与同步/异步的区别

    阻塞,非阻塞 同步,异步 阻塞与非阻塞最大的区别是调用方一直等待还是先去处理别的事情. 同步与异步最大的区别就是被调用方返回结果之前的这段时间内,调用方是否一直等待. 那么阻塞和同步,非阻塞和异步是一 ...

  6. 怎样理解阻塞非阻塞与同步异步的区别?

    发现很多人对这两个概念往往混为一谈(包括本人,不是很理解). 阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个 ...

  7. AJAX中的请求方式以及同步异步的区别

    请求方式,分为GET与POST: GET   最为常见的HTTP请求,普通上网浏览页面就是GET.GET方式的参数请求直接跟在URL后,以问号开始.(JS中用window.location.searc ...

  8. linux线程同步与异步的区别,怎样理解阻塞非阻塞与同步异步的区别?

    "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1.同步与异步 同步和异 ...

  9. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

最新文章

  1. centos mysql tar 安装mysql_centos 安装 mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz 详细步骤
  2. python常见的文件操作:打开、创建等
  3. Java基础(三十二)JDBC(2)连接数据库
  4. Asp.Net文件和文件夹操作大全
  5. html动态网站维护页面
  6. Bootstrap 聚合
  7. SQLMAP参数中文解说
  8. linux 下vim文件乱码 cat文件正常处理方法
  9. 怎么用python画房子_怎么用python画小猪佩奇
  10. android 自动答录机源码,自动答录机下载_自动答录机 2.4.6.0 安卓版_零度软件园...
  11. 编写简单的触摸屏驱动程序——基于QEMU
  12. 临时邮箱 十分钟邮箱 简介
  13. 信阳市少年计算机学校,信阳市胜利路学校开展少年之声小记者选拔活动
  14. 软件需求分析步骤方法
  15. GPS 点可视化(英文地图打点,热力图,测距)
  16. GameFramework篇:StarForce资源加载细节讲解(一:资源加载辅助器)
  17. 英语八年级上册计算机的事实,人教版英语|八年级上册各单元必考知识点汇总,收藏!...
  18. 2022-2027年中国在线语言教育行业市场深度分析及投资战略规划报告
  19. Ceisum加载天地图(矢量、影像)
  20. iOS实现浮动泡泡功能,悬浮泡泡,windows系统屏幕保护程序的气泡功能(碰撞检测)

热门文章

  1. 问题 C: 调酒壶里的酸奶 BFS
  2. 计算机一级死都过不了怎么办,电脑突然卡死不动重启都没用怎么办
  3. Android渲染画面,Android系统图像渲染简介
  4. jdk重新安装需要卸载吗_linux卸载jdk并重新安装
  5. 跨平台python开发_《跨》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  6. Vim 插件YouCompleteMe(YCM)安装
  7. 快速选择算法的C语言实现
  8. 心念城南好风景,花开时节愿逢君
  9. 疯狂讲义随笔——使用二次曲线quadraticCurveTo()画花朵
  10. java滚动条下拉_[Java教程]相对漂亮的滚动条slimscroll可以实现下拉加载