常见的网络IO模型(BIO、NIO、AIO等)

对着背影说爱祢 提交于 2019-12-04 12:33:45

首先说一下这里单独指的是网络IO,我们再这个基础去探讨。

IO,分为两个步骤,第一步是等待数据阶段,数据放入系统内核。第二步是从系统内核复制到内存,这里就可以被应用程序使用了。

先简单抽象一下个人的理解,然后在详细解释一下IO模型的具体细节。

BIO(阻塞IO),在第一步阻塞,第二步阻塞。接收多个请求可以通过多线程来处理,但对资源的耗费过高。

NIO(非阻塞IO),在第一步非阻塞,第二步阻塞。在第一步操作异步也就节省了对线程资源的占用(这一步耗时是较长的),因此对并发的支持大大的提升。

从上图,可以看到第一步孙然非阻塞了,但还需要轮询需要的结果,这时候就会想有没有更好的办法。

 

多路复用IO(IO multiplexing),使用select() 的事件驱动模型只用单线程(进程)执行,占用资源少,不消耗太多 CPU,同时能够为多客户端提供服务。但这个模型依旧有着很多问题。首先select()接口并不是实现“事件驱动”的最好选择。因为当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。很多操作系统提供了更为高效的接口,如linux提供了epoll,BSD提供了kqueue等。

AIO(异步IO),在第一步、第二步都是非阻塞。目前来说个人感觉使用情景较少暂时不过多介绍。

总结:上面介绍的io模型为概念,和系统级别的,而实际开发阶段有好友框架供使用,如netty、Quasar等,有时间后面写一篇 netty快速开发入门的文章。上面均为个人理解,如有错误欢迎指正和交流。

技术交流群:208779755

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!