一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步

python爬虫人工智能大数据

共 3072字,需浏览 7分钟

 ·

2020-07-31 18:42


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

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

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

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

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

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

这就是同步阻塞

大姨一走,我三叔立马冲了上来 三叔:“别信你姨的,她邻居的外婆家的二儿子的堂弟的侄女什么样我不知道吗,来,叔给你介绍个”,一边说着,一边掏出了手机,照片大概是这个样子不要问我为什么没有脸,看到这苗条的身姿,豪迈的步伐,更重要的是比我还少的头发,还要去看脸吗?我深吸一口气,“叔,我没猜错的话,她也是个程序员吧?” 三叔:“厉害啊,大侄子,这你都知道,我就说你们合适吧”

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

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

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

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

这就是同步非阻塞

进门,刚刚躺上我心爱的小沙发,三大爷又来了 三大爷:“年轻人,知道你为什么没有女朋友嘛?知道我来干什么的嘛?” 我:“大爷,难道你有什么秘诀相授?” 此时我脑海里浮现出这样一幅图:我:“大爷,其实我想自己努力,我不是这样的人,不过你要是非要给我的话,我也不太好意思拒绝?国外的你有吗?” 三大爷:“信不信我一巴掌抽死你?” “不要废话,看照片,行不行,给句话” “只要你娃儿说行,剩下的全交给你大爷就行等你见到面的时候,她就是你女朋友了,撩都不用你撩,你该干嘛干嘛去

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

我:“大爷威武!”

这就是异步非阻塞

看完这个故事,你懂了吗??ps:此故事纯属虚构,如有雷同,那你就逗笑我了,哈哈哈!还不懂?没关系,接着往下看,我们进入正式的开车环节!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

看到这里,你懂了吗?

用通俗的语言描述

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

用专业的话来说就是

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

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

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

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

本文系程序员DMZ投稿,原文链接https://blog.csdn.net/qq_41907991/article/details/105108319

往期精选

Java技术核心总结出 PDF 版本了!!!

我画了35张图就是为了让你深入 AQS

操作系统怎么学?cxuan 是这样说的

2020,微服务之死?

这是我看过关于 volatile 最好的文章

python爬虫人工智能大数据公众号




浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报