小故事要不要了解下(异步&同步&阻塞&非阻塞简单解析)

    劫匪冲进某花园小别墅,端着AK47,向某衰男甩过去一个袋子:说,快,把现金拿出来给我放进去,这个时候劫匪一直跟着衰男去装钱,看钱装满了他就拿走,此时劫匪是阻塞 的,因为劫匪不能干其他的,得看着这个衰男,免得他搞鬼。

    想象下,如果劫匪等衰男自己去装钱,在钱装满之前,他自己可以到处翻箱倒柜,找点值钱的首饰黄金之类的,那么这个时候劫匪就是非阻塞 的,因为劫匪并没有阻塞在衰男去装钱这个环节上,劫匪可以自由活动做点其他的小买卖。

    再来回顾下上面的情节,如果劫匪在抢*劫时需要不时自己看看衰男把钱装好了没有,那么此时劫匪是在同步 工作,因为他在等待衰男把钱装好,自己要不停的关注下。

    当然,劫匪可以给衰男说:把钱装好了,你自己过来找我。这个时候劫匪可以继续等着不做其他的事情,也可以去做点其他的事情,但是劫匪可以不用去看衰男是否把钱装好,因为衰男钱装好了会自动通知劫匪:大哥,钱好了,你拿走吧。这个时候劫匪就是异步 在工作,他提供了一个callback机制给衰男。

    好啦,上面的故事,是我在网上看到的一个段子,比较形象,但是到这里呢,我们就按着程序猿的思路,来总结下异步&同步&阻塞&非阻塞它们的关系。

    首先,同步和异步我们可以理解为,消息通知机制相关=>需要自己关注还是提供callback。再来就是阻塞和非阻塞,我们们可以理解为,等待消息时的状态=>是否可以干别的事情

    有了这些认知,我们就可以在相互结合的情况下做出如下总结:

        1、同步阻塞: 劫匪看着衰男把钱装好,不能干其他事情

        2、同步非阻塞:劫匪自己也到处搜索宝贝,但是还要不时跑回来看看钱装好没有。

        3,、异步非阻塞:劫匪自己也到处搜索宝贝,衰男把钱装好了自动过来告诉劫匪好了

        4、异步阻塞:  劫匪就在那里傻等着,也不用管钱是否装好,衰男把钱装好了自动过来告诉劫匪好了

    完事呢,大家应该对异步&同步&阻塞&非阻塞有了一个大概的了解了,嘿嘿,上面的都是看别人的文章自己大概总结的。接下来,咱们来自己分析下这些名词。

    首先我们得先确定,同步和异步是时序概念,阻塞和非阻塞是一种响应模式(特别是当资源受限时,响应很不一样)。完事呢,我们就可以来分表看下了。

    同步我们可以看作是通信双方都清楚的事件流,是通信协议最重要的部分。没有同步,就是没有共同语言,同步是通信的前提。然而异步是为了提供并发性而出现的一个概念(如线程就是一种异步机制,中断也是)。

    我们上面已提到同步是通信的前提,所以所谓的异步不是就1对1的通信而说的,而是就1对多或多对多这样的通信整体来说的。所以就具体的1对1通信来说,异步需要提供回调、事件或信号等机制来同步。

    我们来举个例子:A进程与B进程存在了耗时的通信,于是A开一个线程A1与B周旋,不等A1与B通信完成而用其它线程继续与C,D等进程通信,当A1与B通信完毕后,采用同步机制(信号,事件等)来通知A,B进程。这样从整体上看,A进程与B进程间的通信是异步的,而更为细化点A1与B还是同步的。

    完事来看阻塞与非阻塞,阻塞与非阻塞的出现也是为了提供并发性而出现的一种实现机制。在单任务机器上阻塞是必然的,而在多任务机器上,阻塞给其它非阻塞提供了更多的调度机会。它们之间最大的区别就是,当操作环境不具备时,阻塞操作不返回,阻塞的执行者就被挂起,直到操作环境具备时,阻塞操作才返回,阻塞的执行者被唤醒。而非阻塞操作则不然,无论操作环境是否具备,都是立即返回。

    然而正是因为异步&同步&阻塞&非阻塞是两个不同的概念,所以你中有我,我中有你。同步是通信前提,阻塞&非阻塞以及异步归根到1对1通信时都是同步的。异步是并发思想或者说概念,没有异步,阻塞,非阻塞就没了指导思想,阻塞何时变成非阻塞(这个通知机制就是异步的概念)。阻塞,非阻塞是实现多对多异步通信的一种手段,其实,我们用其它手段实现异步通信时,最终还是通过阻塞某些操作并不阻塞另外一些操作来实现的。

    好啦,说了辣么多,相信大家也有点懵了。总之大家只需要记住一句话就好了。那就是,同步是逻辑层次上的点对点的一致协商是通信前提,异步是并发(包含突发)的代名词,阻塞,非阻塞是实现并发的手段。

    ok,到这里,本篇文章就算是结束了。如果感觉不错的话,请多多点赞支持哦。。。

猜你喜欢

转载自blog.csdn.net/luyaran/article/details/80914642