相信刚入门计算机科学的小伙伴们来说,这四个词–异步,同步,阻塞,非阻塞,直接搞晕,因为单单理解四个词就算了,他们还能组合,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞+_+。因此今天就主要谈谈这几个词,顺便备个份,怕是我哪一天忘记了回来看看2333333

首先,这些概念出现的场景发生在应用程序调用系统内核之间。我们知道例如十分耗时的IO操作就是由内核完成的,由于应用程序(cpu)处理的速度十分快,而IO处理很慢,所以就有了等待与不等待的问题,因此就有了以上各个词的出现。

单个解析

1.同步,在调用方层面(上文中的应用程序)上,当应用程序发起同步调用时,这个应用程序脑袋很倔,一心只想把眼前的事做完(获取处理结果才算做完)在做其它的,因此他需要被调方(IO)返回到了处理结果时才会结束

2.异步,在调用方层面上,当应用程序发起异步调用时,这个应用程序就很机灵了,当它发起调用后,不需被调方返回处理结果,直接去干别的事,如果被调方(IO)处理完了事情后,通过通知的方式通知它就好

3.阻塞,在被调用方层面上,当被调方(IO)接收到调用通知之后,会把调用方(应用程序)挂着,不会跟调用方说一句话,直到自己处理完数据后,把数据复制到内存,然后再把结果返回给应用程序。这就像不解风情的程序猿与测试妹子,妹子告诉程序猿:”你这里有bug!” 然后程序猿一句话也不理妹子,埋头去debug,直到修复了,才告诉妹子说bug修复了/(ㄒoㄒ)/ (注孤生啊!)

4.非阻塞,在被调用方层面上,当被调方接受到调用通知之后,会先返回信息告诉调用方:”我知道了,你先去忙别的吧”。注意这里返回的信息与完成处理任务返回的信息时两码事,事情还没做完(处理IO任务)!!所以说这个程序猿就很有情商了,可以可以O(∩_∩)O

组合解析

同步阻塞:一个很倔的测试妹子与一个注孤生的程序猿

过程:当调用方发起调用时,调用者一直等待处理的结果才结束,而被调者在发生调用后,也不会立即返回,而是处理完一系列流程(如磁盘寻道->读取数据->复制数据到内存)时,才返回处理结果给调用者,其间把调用方挂起。

例子:一个等着bug修复完做其他事的妹子去找(调用)注孤生的程序猿,程序猿知道后,一声不吭就debug,直到修复完bug,返回处理结果给妹子,妹子收到结果后,就去做其他事了


同步非阻塞:一个很倔的测试妹子与一个很机灵的程序猿

过程:当调用方发起调用时,调用者需要被调方得到处理结果才结束,而被调者在发生调用后,立即返回信息给调用者,不过还没得到处理内容,当调用者发现得到的不是处理结果,继续发起调用,而被调者依然立即返回,如此反复,直到被调者在过程中处理完信息,然后返回给处理结果给调用者,调用者得到处理结果后,结束调用。

例子:一个很倔的测试妹子去找一个机灵的程序猿,程序猿告诉她先去干别的事,妹子收到信息后,回到自己的座位上,想了想我还要等到那个bug修复完,因此继续找程序猿,程序猿又告诉她回去等,如此反复,程序猿在一边被骚扰一边修复bug直到修复完毕后,把结果告诉妹子,妹子得到结果开心的做其他事了


异步阻塞:一个机灵的测试妹子与一个注孤生的程序猿

过程:当调用者发起调用时,被调者收到调用通知后,把调用者挂起,而自己就去处理数据,直到处理完毕后,把挂起的调用者拉回来,把结果返回给它,然后结束调用。

例子:一个很机灵的妹子,在发现了bug后,本来想先通知(调用)一下程序猿,然后自己就去干别的事,结果在她找到程序猿后,这个不识趣情商低的程序猿,直接不理妹子,让妹子在那儿干等(挂起),直到自己把bug修复完之后,就告诉一直站在那儿的妹子说,bug修复完了,你可以走了(妹子拿到了结果)

由于太过奇葩,概念图片不予展示2333333


异步非阻塞:一个很机灵的测试妹子与一个很机灵的程序猿

过程:当调用方发起调用时,被调者收到调用通知后,立即返回给调用者,告诉它可以接到调用通知了,然后调用者去开始其他任务(注意:调用在这里已经结束了),而被调用者在完成调用任务得到处理结果后,通过通知的形式告诉调用方。

例子:一个很机灵的妹子,在发现了bug后,找到了机灵的程序猿,说:”帅哥,你这里有bug”,程序猿知道后说:“好的,这里交给我,你先去忙别的吧!”。然后妹子就去忙别的事了,程序猿就开始debug,在修复完bug后,发了封邮件通知测试妹子。(于是他们两个就在一起了O(∩_∩)O)

撒花w_w

通过我上面的举例,大家应该知道哪对会修成正果吧?没错就是异步非阻塞,还有同步阻塞。异步非阻塞合理的利用了cpu的空闲时间,不让干等,大大提高了工作效率,在处理并行中十分常用。而同步阻塞,虽然这两个都奇葩,但是这两个奇葩在一起也好过剩下更加两对搭配,算是中规中矩吧。所以目前大多的应用要么就采用异步非阻塞,要么就采用同步阻塞,剩下两对因为不太科学,所以少人用~

通过这样搞笑的解析,大家应该都明白了吧?不明白的话,多看几次例子以及概念图!!过几天我发一篇关于机智程序猿如何发邮件给测试妹子(被调用者通知调用者)的博客

感谢

概念图来源