看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西。不要急,且听我慢慢道来

年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友。这不,刚刚门口,我的大姨,二叔,三大爷就已经在门口蹲着我了

大姨:“大外甥啊,给你介绍个女朋友要不咯?”

我(心理活动):要个鬼啊,我还年轻,女朋友还在幼儿园呢!再说了,程序员需要女朋友嘛?啊???代码就是我媳妇儿

我:“当然要呀,大姨你介绍的,怎么滴都得去看看呀” 大姨:“好,大外甥!相信大姨,你在原地不要走动,等我去找我邻居的外婆家的二儿子的堂弟的侄女,保证给你要到电话。之后就看你本事了!”

我(心理活动):........,怕是要等到原地爆炸,之后还得自己去撩,唉~ 我的姨还是这么的不靠谱

这就是同步阻塞

大姨一走,我三叔立马冲了上来 三叔:“别信你姨的,她邻居的外婆家的二儿子的堂弟的侄女什么样我不知道吗,来,叔给你介绍个”,一边说着,一边掏出了手机,照片大概是这个样子

不要问我为什么没有脸,看到这苗条的身姿,豪迈的步伐,更重要的是比我还少的头发,还要去看脸吗?我深吸一口气,“叔,我没猜错的话,她也是个程序员吧?” 三叔:“厉害啊,大侄子,这你都知道,我就说你们合适吧”

我(心里活动):我XXXXX,此处省略5000字

我:“.......................” 我:“得嘞,我是不是也得在这等着您去要电话啊?” 三叔:“想什么呢?我能跟你大姨一样吗?你先回去拾掇拾掇,每过5分钟给我打个电话,问问情况就行。不过叔只负责给你要电话啊,能不能成还得靠你自己!”

我(心里活动):唉~,打电话就打电话吧,至少可以回去坐会儿了

我:“......................,好的,我会过段时间就问候下您老人家的” 三叔:“信不信我一巴掌抽死你?” 我:“..................”

这就是同步非阻塞

进门,刚刚躺上我心爱的小沙发,三大爷又来了 三大爷:“年轻人,知道你为什么没有女朋友嘛?知道我来干什么的嘛?” 我:“大爷,难道你有什么秘诀相授?” 此时我脑海里浮现出这样一幅图:

我:“大爷,其实我想自己努力,我不是这样的人,不过你要是非要给我的话,我也不太好意思拒绝?国外的你有吗?” 三大爷:“信不信我一巴掌抽死你?” “不要废话,看照片,行不行,给句话” “只要你娃儿说行,剩下的全交给你大爷就行等你见到面的时候,她就是你女朋友了,撩都不用你撩,你该干嘛干嘛去

我(心里活动):你大爷还是你大爷

我:“大爷威武!”

这就是异步非阻塞

看完这个故事,你懂了吗??ps:此故事纯属虚构,如有雷同,那你就逗笑我了,哈哈哈!

还不懂?没关系,接着往下看,我们进入正式的开车环节!

首先,我们要知道一次IO的过程必然会有三个角色的参与

  1. 应用程序
  2. 内核
  3. 数据

以一次数据的读取为例,应用程序是没有办法直接操纵硬件设备的,只有通过内核才能跟硬件交互。当网卡接收到数据之后,此时数据在网卡中,需要内核将网卡中的数据读取到内核空间中,再从内核空间拷贝到用户空间,这个时候应用程序才拿到数据,读取数据结束。

在上面相亲的这个过程中一共也有三个角色,分别是

  • 媒婆(大姨,二叔,三大爷)
  • 我的相亲对象(一个未知女性)原谅我没有用女生这个词汇,你们懂的,知道通讯录的人想法不一样

类比于IO过程中的三个角色

  • 应用程序(我)
  • 内核(媒婆)
  • IO的数据(相亲对象)

对于我而言,最终目的是为了找到女朋友, 对于应用程序而言,最终始要读取到数据。

我向媒婆发起了一个找女朋友的请求(虽然我是被迫的,不要在意这些细节),对于程序而言,就是程序向内核发起了一个读取数据的请求。

首先说我大姨:在这一次交互过程中,如果大姨没有给到我电话号码,那么此时我只能原地等待,什么都干不了,哪里都不能去所以我被找女朋友这件事阻塞了,直达大姨告诉我,电话要到了,这个时候才能继续下去,其次,请注意大姨只负责告诉我电话号码,通过这个电话号码把这个女性撩成女朋友这件事还是要我去做,所以我找女朋友这个过程是同步的

类比应用程序的IO,就相当于应用程序发起了一个IO请求(以读取数据为例),此时需要进行一次系统调用,内核由用户态切换到内核态,内核开始跟硬件设备进行交互并从硬件设备中读取数据,此时可能硬件设备还没有接收到数据,所以内核函数一直阻塞,直到数据到达才进行返回。这就是同步阻塞模型

而对二叔而言:在跟二叔的交互过程中,并不需要我一直等待二叔给我找到电话号码,只需要过一段时间打电话问候一次我二叔就行了,他会向我返回是否拿到了电话号码,在这期间我可以做任何事情所以我没有被找女朋友这件事情阻塞。但是,当我从二叔手中拿到电话的时候,我还是需要将这个未知女性撩成我的女朋友,所以我找女朋友这个过程还是同步的。这就是同步非阻塞模型

类比应用程序的IO,当应用程序发起了一次读取数据的请求,还是会发起系统调用,但是此时内核根据硬件中是否有数据执行不同的操作,如果有数据,那么将数据拷贝到用户空间,如果没有数据也会返回一个标志,比如-1,应用程序在轮询期间并没有一直阻塞,而是可以进行执行。这就是同步非阻塞

再看我三大爷:三大爷就牛逼了,我向三大爷发起一个找女朋友的请求,然后就等着女朋友送上门。我就问你叼不叼吧?不仅不需要在这傻等,也不用经常问候,甚至撩都不用撩了,叼不叼!!叼不叼!!!你大爷永远是你大爷

类比应用程序的IO,应用程序只需要发起一次读取数据的请求,接下来就等着内核将数据拷贝到用户空间,并且内核将数据拷贝完成后会通知应用程序,在整个过程中程序可以继续往下执行。类似下面这样的代码:

read(byte[],// 传入一个回调函数,内核完成数据拷贝后直接执行这个回调函数)// 这里你想干嘛就干嘛

看到这里,你懂了吗?

用通俗的语言描述

  • 阻塞/非阻塞:描述的是发起请求的人的状态,比如:我在发起相亲请求后,一直处于阻塞状态,一直在原地等待,什么都不能做。
  • 同步/异步:代表的是请求被完成的方式,如果最终还是由我完成的,那么就是同步的,如果不是由我完成的,而是别人完成后通知我的就是异步的

用专业的话来说就是

  • 阻塞/非阻塞:描述的是调用者调用方法后的状态,比如:线程A调用了B方法,A线程处于阻塞状态。
  • 同步/异步:描述的方法跟调用者间通信的方式,如果不需要调用者主动等待,调用者调用后立即返回,然后方法本身通过回调,消息通知等方式通知调用者结果,就是异步的。如果调用方法后一直需要调用者一直等待方法返回结果,那么就是同步的

基于上面两点,可以推导出:

异步阻塞是没有意义的,也就是不存在异步阻塞这种说法。你想想,事情都不需要我做了,我还阻塞着干嘛?王者荣耀不香吗?

码字不易,来个素质三连吧~!!!!

作者:程序员DMZ

来源:程序员cxuan公众号

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

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

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

  2. cpu 被挂起和阻塞_迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章...

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

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

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

  4. cpu 被挂起和阻塞_同步异步阻塞非阻塞并发并行讲解

    通过一个很形象的例子来说明同步异步阻塞非阻塞. 场景: 小明使用 chrome 下载一个软件. 1. 同步阻塞 小明使用 没有提醒功能的chrome 下载一个软件.小明 一直坐在电脑面前什么事也不做, ...

  5. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  6. 正确理解同步/异步和阻塞/非阻塞的区别:

    之前一直把异步和非阻塞混为一谈,在 了解BIO和NIO的区别时才发现了两者的差异,看了网上很多文章觉得说的总是差点意思,下面是个人理解: 1.同步 非同步 阻塞 非阻塞 概念 怎样理解阻塞非阻塞与同步 ...

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

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

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

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

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

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

最新文章

  1. 想知道spring boot+cloud+docker的微服务体系架构如何使用吗?
  2. GCB:西农韦革宏团队-土壤多营养级网络的复杂度增强农田系统生物多样性和多功能性的联系...
  3. 20162309单步追踪数组及查找课下补分博客
  4. insert式注射攻击解析
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
  6. java 基础数据类型面试_Java(数据类型)基础面试
  7. Kendo UI开发教程(9): Kendo UI Validator 概述
  8. 数据库安装时的log路径
  9. SpringCloud工作笔记038---spring cloud-简单网关权限控制_直接在zuul里面做
  10. Java 工程师成神之路!
  11. lambda,reserve list, list comprehension, string of slice
  12. servlet执行流程代码分析
  13. JAVA文章相似度对比(hanlp)
  14. 从贵价当道到平价之光,我们该如何看待全球智能穿戴市场之间的次元壁?
  15. Windows系统基础配置
  16. 下列各命令中可以在计算机屏幕上,下列各命令中,可以在计算机屏幕上放映演示文稿的是()。...
  17. Java通过openOffice实现word,excel,ppt转成pdf实现在线预览
  18. 计算机图形和游戏技术专业,宾夕法尼亚大学计算机图形和游戏技术学理学硕士研究生申请要求及申请材料要求清单...
  19. 开源的调色板软件:焰火十二卷(Rickrack)
  20. OC与C语言的一些区别

热门文章

  1. Visual Studio Code为什么能这么牛X?
  2. 学霸女孩放弃保研再次高考,原因让人泪目…
  3. RuntimeError: each element in list of batch should be of equal size
  4. 基于深度学习算法和传统立体匹配算法的双目立体视觉
  5. 写论文神器APEX-NET:自动重新绘制图像
  6. iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?...
  7. Flutter 构建完整应用手册-动画
  8. .NET/C#中对自定义对象集合进行自定义排序的方法
  9. 使用文件给swap增加空间
  10. Android自定义滑动验证条