“
看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西。不要急,且听我慢慢道来
年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友。这不,刚刚门口,我的大姨,二叔,三大爷就已经在门口蹲着我了
大姨:“大外甥啊,给你介绍个女朋友要不咯?”
“
我(心理活动):要个鬼啊,我还年轻,女朋友还在幼儿园呢!再说了,程序员需要女朋友嘛?啊???代码就是我媳妇儿
我:“当然要呀,大姨你介绍的,怎么滴都得去看看呀” 大姨:“好,大外甥!相信大姨,你在原地不要走动,等我去找我邻居的外婆家的二儿子的堂弟的侄女,保证给你要到电话。之后就看你本事了!”
“
我(心理活动):........,怕是要等到原地爆炸,之后还得自己去撩,唉~ 我的姨还是这么的不靠谱
这就是同步阻塞
不要问我为什么没有脸,看到这苗条的身姿,豪迈的步伐,更重要的是比我还少的头发,还要去看脸吗?我深吸一口气,“叔,我没猜错的话,她也是个程序员吧?” 三叔:“厉害啊,大侄子,这你都知道,我就说你们合适吧”“
我(心里活动):我XXXXX,此处省略5000字
我:“.......................” 我:“得嘞,我是不是也得在这等着您去要电话啊?” 三叔:“想什么呢?我能跟你大姨一样吗?你先回去拾掇拾掇,每过5分钟给我打个电话,问问情况就行。不过叔只负责给你要电话啊,能不能成还得靠你自己!”
“
我(心里活动):唉~,打电话就打电话吧,至少可以回去坐会儿了。
我:“......................,好的,我会过段时间就问候下您老人家的” 三叔:“信不信我一巴掌抽死你?” 我:“..................”
这就是同步非阻塞
我:“大爷,其实我想自己努力,我不是这样的人,不过你要是非要给我的话,我也不太好意思拒绝?国外的你有吗?” 三大爷:“信不信我一巴掌抽死你?” “不要废话,看照片,行不行,给句话” “只要你娃儿说行,剩下的全交给你大爷就行,等你见到面的时候,她就是你女朋友了,撩都不用你撩,你该干嘛干嘛去”
“
我(心里活动):你大爷还是你大爷
我:“大爷威武!”
这就是异步非阻塞
还不懂?没关系,接着往下看,我们进入正式的开车环节!
首先,我们要知道一次IO的过程必然会有三个角色的参与
应用程序
内核
数据
“
以一次数据的读取为例,应用程序是没有办法直接操纵硬件设备的,只有通过内核才能跟硬件交互。当网卡接收到数据之后,此时数据在网卡中,需要内核将网卡中的数据读取到内核空间中,再从内核空间拷贝到用户空间,这个时候应用程序才拿到数据,读取数据结束。
在上面相亲的这个过程中一共也有三个角色,分别是
我
媒婆(大姨,二叔,三大爷)
我的相亲对象(一个未知女性)原谅我没有用女生这个词汇,你们懂的,知道通讯录的人想法不一样
类比于IO过程中的三个角色
应用程序(我)
内核(媒婆)
IO的数据(相亲对象)
对于我而言,最终目的是为了找到女朋友, 对于应用程序而言,最终始要读取到数据。
我向媒婆发起了一个找女朋友的请求(虽然我是被迫的,不要在意这些细节),对于程序而言,就是程序向内核发起了一个读取数据的请求。
首先说我大姨:在这一次交互过程中,如果大姨没有给到我电话号码,那么此时我只能原地等待,什么都干不了,哪里都不能去,所以我被找女朋友这件事阻塞了,直达大姨告诉我,电话要到了,这个时候才能继续下去,其次,请注意大姨只负责告诉我电话号码,通过这个电话号码把这个女性撩成女朋友这件事还是要我去做,所以我找女朋友这个过程是同步的。 image.png类比应用程序的IO,就相当于应用程序发起了一个IO请求(以读取数据为例),此时需要进行一次系统调用,内核由用户态切换到内核态,内核开始跟硬件设备进行交互并从硬件设备中读取数据,此时可能硬件设备还没有接收到数据,所以内核函数一直阻塞,直到数据到达才进行返回。这就是同步阻塞模型
而对二叔而言:在跟二叔的交互过程中,并不需要我一直等待二叔给我找到电话号码,只需要过一段时间打电话问候一次我二叔就行了,他会向我返回是否拿到了电话号码,在这期间我可以做任何事情,所以我没有被找女朋友这件事情阻塞。但是,当我从二叔手中拿到电话的时候,我还是需要将这个未知女性撩成我的女朋友,所以我找女朋友这个过程还是同步的。这就是同步非阻塞模型 image.png类比应用程序的IO,当应用程序发起了一次读取数据的请求,还是会发起系统调用,但是此时内核根据硬件中是否有数据执行不同的操作,如果有数据,那么将数据拷贝到用户空间,如果没有数据也会返回一个标志,比如-1,应用程序在轮询期间并没有一直阻塞,而是可以进行执行。这就是同步非阻塞
再看我三大爷:三大爷就牛逼了,我向三大爷发起一个找女朋友的请求,然后就等着女朋友送上门。我就问你叼不叼吧?不仅不需要在这傻等,也不用经常问候,甚至撩都不用撩了,叼不叼!!叼不叼!!!你大爷永远是你大爷 image.png 类比应用程序的IO,应用程序只需要发起一次读取数据的请求,接下来就等着内核将数据拷贝到用户空间,并且内核将数据拷贝完成后会通知应用程序,在整个过程中程序可以继续往下执行。类似下面这样的代码: image.png看到这里,你懂了吗? image.png
用通俗的语言描述
阻塞/非阻塞:描述的是发起请求的人的状态,比如:我在发起相亲请求后,一直处于阻塞状态,一直在原地等待,什么都不能做。
同步/异步:代表的是请求被完成的方式,如果最终还是由我完成的,那么就是同步的,如果不是由我完成的,而是别人完成后通知我的就是异步的
用专业的话来说就是
阻塞/非阻塞:描述的是调用者调用方法后的状态,比如:线程A调用了B方法,A线程处于阻塞状态。
同步/异步:描述的方法跟调用者间通信的方式,如果不需要调用者主动等待,调用者调用后立即返回,然后方法本身通过回调,消息通知等方式通知调用者结果,就是异步的。如果调用方法后一直需要调用者一直等待方法返回结果,那么就是同步的
基于上面两点,可以推导出:
“
异步阻塞是没有意义的,也就是不存在异步阻塞这种说法。你想想,事情都不需要我做了,我还阻塞着干嘛?王者荣耀不香吗?
我的java基础学习交流峮:1080621881 。
网友评论