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

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

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

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

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

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

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

这就是同步阻塞

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

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

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

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

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

这就是同步非阻塞

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

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

我:“大爷威武!”

这就是异步非阻塞

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

看到这里,你懂了吗?

用通俗的语言描述

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

用专业的话来说就是

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

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

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

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

发布了135 篇原创文章 · 获赞 84 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41907991/article/details/105108319