JAVA中AIO、BIO、NIO的区别

作者: hoozenorg | 来源:发表于2018-07-03 16:38 被阅读409次

        在我们的生活与工作中,网络无处不在,并且在不断地发展。说到网络,就不得不说网络协议了,在TCP和UDP协议中,TCP使用应该是比较多的,下面我们就说下TCP和UDP。

        TCP:TCP协议是一种面向连接的协议,什么是面向连接呢?就是在双方发送数据前,保证已经建立了可靠的连接,这也是TCP三次握手的原因。

        UDP:UDP协议是一种面向报文的协议,要发送数据时,无需建立可靠的连接,直接抓取应用程序的数据并丢到网络上。

        并且,TCP能够保证数据的正确性,并且保证数据包的顺序,而UDP是无连接的,只是把数据包丢到网络中,对方收不到也不会重发,可能导致数据丢包、顺序错乱,所以,在一般的网站中,向下单、抢购、付款等等操作都是TCP方式的。

        在网络变成中,有一个很重要的东西,那就是IO的方式,主要有AIO、BIO、NIO,IO方式对并发性能影响很大。

        BIO:最传统的IO方式,是一种阻塞的IO。在目前的大多数网站中,都不会采用。这还要从socke(套接字:用来进行网络两端通信的,本质是编程接口)说起。

        socket有TCP socket和UDP socket。

        就是这种阻塞模式的socket,使得每一个socket都要绑定到一个线程上,而且服务器上创建线程也是有限的,如果一个socket阻塞了,那么该线程也就阻塞了,浪费了大量的资源。

        NIO:NIO解决了socket与IO线程耦合的问题。java的NIO框架比较复杂,现在有了许多基于NIO的网络框架,隐藏了NIO底层的复杂细节,简化了编程。主流的框架有netty等。NIO是基于多路复用模式的,一般都实现了Reactor(反应器)模型。

        并且NIO抛弃了stream、byte[]等数据结构,采用了新的数据结构ByteBuffer。

        AIO(其实就是NIO.2):AIO主要有两部分组成,Files用于解决文件的一部处理问题,Sockets用于解决Socket的一部处理问题,在Linux上,主要有两种实现,一种是Posix AIO,即用户态实现,另一种是Kernel Native AIO内核态实现,性能比较高,nginx、mysql等的新版本都支持kernel Natice AIO。

        其实AIO才是非阻塞的IO,NIO不是非阻塞的IO,NIO是在IO就绪后得到通知进行对IO进行读写,此时进程是阻塞的(和BIO对比的话就是不用等待IO就绪时间),属于同步IO。而AIO是直接从buffer中取出数据(IO的读写有操作系统完成,自己只负责逻辑部分的处理),是异步的IO。

        初次发表文章,请大家多多指教。

    相关文章

      网友评论

        本文标题:JAVA中AIO、BIO、NIO的区别

        本文链接:https://www.haomeiwen.com/subject/avljuftx.html