相信很多人在面试的过程中,都被问到过同步和异步的区别、阻塞和非阻塞的区别,以及这两对关系又有什么联系?本文尽可能从专业的角度,用易懂的语言,帮助大家理解

01 前置知识

用户空间和内核空间

操作系统可以支持多个进程同时运行,但需要保证不同进程之前不会相互影响(即一个进程不能恶意读取或修改其他进程中的数据)。因此将操作系统分为用户空间和内核空间,用户空间进行数据的处理,而对于数据的读写以及其他的调度和管理,则有内核空间处理

进程通信
两个进程通信的时候,都会将数据从用户空间的缓冲区拷贝到内核空间的缓冲区,然后将内核空间缓冲区的数据发送出去。接收的时候相反,会先把网络传输过来的数据放置到内核缓冲区中,然后再拷贝到用户空间的缓冲区中进行处理

02 相关概念

关于同步、异步、阻塞、非阻塞在《操作系统概念(第九版)》中有如下解释


结合上面的概念,通过进程A和B通信,来理解一下这几者的关系

  • 同步

也就是图中的阻塞发送,A调用send()方法与B通信,由于是同步(阻塞发送),那么在A进程所对应的系统内核空间中,内核缓冲区的数据没发送出去之前,A进程都是一直等待的

  • 异步

也就是图中的非阻塞发送,A调用send()方法与B通信,由于是异步(非阻塞发送),A进程只需要把要发送的消息由用户空间拷贝到内核空间,不用等到内核缓冲区的消息发送出去,就可以处理其他逻辑

  • 阻塞

针对的是接收消息的一方,如果A给B要发送消息,B调用receive()方法,如果内核缓冲区中没有数据或者没有到达指定大小的数据,那么B进程就会一直阻塞,直到符合满足返回数据的条件

  • 非阻塞

针对的是接受消息的一方,如果A给B要发送消息,B调用receive()方法,如果内核缓存区中没有数据,那么B就会返回一个空值,不会阻塞

03 阻塞是什么
无论是同步、异步还是阻塞、非阻塞,都离不开阻塞这个概念,那么阻塞到底是什么?下面用一幅图来表示一个进程的生命周期

  • new:代表进程创建
  • ready:进程等待操作系统调度
  • running:操作系统调度,进程拿到cpu开始执行代码
  • waiting:当发生IO、或者调用内核方法主动释放cpu,进入等待状态
  • terminated:进程正常或异常结束

而阻塞就发生在waiting阶段,由于进程在running状态下发起了一个系统调用如(read()调用),该调用不能立即完成,需要等待一段时间,于是内核将该进程标记为waiting状态,也就是阻塞该进程,以确保它不会被cpu调度,浪费cpu资源(即使拿到了cpu,从内核空间获取数据没有准备好,也无法执行后续的逻辑)。

当内核把数据准备好之后,就会从waiting状态变为ready状态,等待操作系统的调用。

04 总结

  1. 同步和异步、阻塞和非阻塞本质上是一对相对的概念。
  2. 在进程通信这个层面,同步和异步针对的是发送方而言,取决于将数据写到内核缓冲区进程的行为,继续等待发送则为同步,反之即为异步。
  3. 在进程通信这个层面,阻塞非阻塞针对的是接收方而言,取决于将内核中的数据能否立即拷贝到用户空间,如果不能直接拷贝则为阻塞,反之则为非阻塞。
  4. 阻塞是进程的一种状态,由于cpu的速度远远高于磁盘速度,为了提高cpu利用率,对于涉及系统调用的进程(牵扯到磁盘读写),会把进程置为阻塞状态,防止cpu调度。

一文搞懂同步异步阻塞非阻塞相关推荐

  1. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步

    看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...

  2. 异步和同步区别是什么_一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步...

    "看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门 ...

  3. 大白话搞懂什么是同步/异步/阻塞/非阻塞

    前言 在最近的一些面试中,跟应聘者聊了比较多关于"同步/异步,阻塞/非阻塞"相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的同学会反问"他们不就是同一个东西吗? ...

  4. java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前言 在最近的一些面试中,跟应聘者聊了比较多关于"同步/异步,阻塞/非阻塞"相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的 ...

  5. 就是要弄懂你之—— 同步 异步 阻塞 非阻塞

    相信很多人都会弄混这些概念,甚至记了之后又容易忘记,其实就是没有深入了解.虽然其他的博客有举一些水壶啊,狗啊等例子,但是还是模糊不清,看看我这个能不能把你弄懂. 本文重在分清楚4者的概念,并没有深入的 ...

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

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

  7. 综合场景搞清楚同步 异步 阻塞 非阻塞

    一.同步和异步 同步和异步是指访问数据的一种机制,关注点在于消息通信机制. 1.同步 (1)描述:发送一个请求,等待返回,再发送下一个请求,同步可以避免出现死锁,脏读的发生. (2)概念:同步就是一个 ...

  8. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

    基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程 ...

  9. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

最新文章

  1. 数据结构笔记--二叉查找树概述以及java代码实现
  2. eclipse启动出错的解决方案:org.osgi.framework.BundleExcep...
  3. linux tar打包压缩排除某个目录或文件
  4. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...
  5. python中浅拷贝和深拷贝分析
  6. linux安卓双系统板子,安卓迷你 PC 主机只要 109 美元,支持 Android 和 Linux 双系统...
  7. Expected tensor for argument #1 ‘input‘ to have the same device as tensor for argument #2 ‘weight‘;
  8. 打造自己的数据访问层(三)
  9. C++新特性探究(一):nullptr
  10. Hyperledger Fabric 网络搭建详解
  11. python类方法和实例方法的区别_python中的类方法,实例方法和静态方法的区别
  12. HDU 5273 Dylans loves sequence【 树状数组 】
  13. 主题:一个成功的RIA技术需要满足的条件(转)
  14. stm32c8t6之跑马灯程序配置
  15. 24节气—霜降文案、海报 , 秋将去,降初霜。
  16. VUE之VUEX常见面试题大全汇总--史上最全【vuex面试题】
  17. 2021寒假MISC打卡DAY1
  18. C++文件操作的具体方法
  19. js vue 设置excel单元格样式_vue+elementui 项目纯前端Export2Excel导出excel,并利用xlsx-style设置单元格样式...
  20. Linux学习教程 | 全文目录

热门文章

  1. 对产品的思考——商业本质的思考
  2. 七天美音音标学习总结
  3. MongoDB安装命令
  4. c语言中的语义错误和语法错误,C语言程序中对错误的调试
  5. WEB课堂作业练习 1 (div布局,表格,锚点,列表)
  6. Python之父强烈推荐,Python3网络爬虫开发实战,爬虫入门必看书籍,豆瓣评分9.2
  7. java二维数组如何传参_C语言中二维数组作为函数参数来传递的三种方法
  8. COM 80040154报错
  9. RK3399之开机Logo动画壁纸相关
  10. BeanCopier封装