BIO,伪异步IO,NIO,AIO是什么
现在有一个小区,小区里有一个快递点。现在有很多住户每天都会收到快递,需要自己去快递点收取快递。 就是原始的BIO方案:
每个住户在知道自己今天有快递要来的时候就去快递点拿快递,但是去的时候快递可能还没到,可能晚上才到。即使这样,住户还是在快递点等一天,什么都不做(阻塞)。直到拿到自己的快递才回家。可想而知,如果今天快递车来的晚,有多少傻子在快递点等快递,甚至快递点会被挤爆!于是物业为了管理,采用了伪异步IO方案:
雇了二十个快递员专门等快递,不管是谁家的,来回送。这样快递点不会挤爆了,但是服务效率还是相当低下。万一谁的快递晚到了,快递员还是只会傻等。排在后面的客户长时间得不到服务后,怨声载道。雇佣的二十个快递员的成本也让物业叫苦不迭。为了解决这种情况,大家又选择了NIO方案:
首先要让快递员聪明起来,对于不是立即配送的顾客,快递员可以先干别的,时不时问一下快递点是不是可以配送了。如果可以,再进行配送。但是还是有点蠢,而且快递员除了送快递也不想干别的。那么我们可以配合IO多路复用方案:快递员依次检查今天的快递目标,看看谁的快递已经到了,检查完之后如果有可以快递的目标,那么就统一送货,没有就持续检查,直到有为止。这样这个小区的快递问题只需要一个快递员就解决了。大家都觉得可以接受,除了物业。物业觉得自己平白无故多雇了一个人,有点不爽。想要更高级的解决方案。然后就和快递点老板商量拿出了AIO方案:
就是老板辛苦一点,看到谁的快递到了,送快递到楼下,给对应住户打电话(消息回调),让住户下楼来拿就可以了。
在这个小故事里,快递员,住户都是用户线程,需要耗费系统成本。在BIO中成本不可控,线程太多可能会让系统资源耗尽,也就是快递点爆了。伪异步IO中,成本可控了,但是如果发生大规模阻塞,很容易让其他排在后面不阻塞的用户得不到资源“饿死”,而且成本依然不低。NIO配合IO多路复用让一个线程监控所有IO端点,成本得到显著降低。但是要注意IO本身所花费的时间不会降低,只是不会再有线程阻塞这种情况发生,所以总时间得到控制。值得注意的是:NIO是同步非阻塞线程,同步是因为IO(配送过程)需要线程自己执行,而AIO不需要(具体可以参考下面的时序图,截取https://www.cnblogs.com/welen/articles/5385837.html)
NIO(多路复用)
AIO