Skip to main content

BIO NIO AIO

几个概念

  • 同步与异步

    • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
    • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

    同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

  • 阻塞和非阻塞

    • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回。线程被挂起
    • **非阻塞:**阻塞就是发起一个请求,调用者一直等待请求结果返回。继续执行其他的代码

BIO

同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。

图片

通过优化,把Socket封装成一个Task放到线程池中去进行处理,线程池维护一个消费队列和N个活跃的线程。对消息队列的连接进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

图解

缺点: 单纯使用多线程处理每次进来一个连接新建一个线程,这样会导致大量的线程存在,消耗内存和CPU资源。如果使用线程池同样会存在当线程数到达一定数量的时候会导致线程切换很频繁。

NIO

NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。

它支持面向缓冲的,基于通道的I/O操作。NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。

NIO和BIO的区别

  • NIO是非阻塞IO,BIO是阻塞IO

  • BIO面向流,NIO面向的缓冲区

  • NIO的三个重要组件

    • channel(通道) : 通道是双向的可以进行读写,通道只能与Buffer进行交互

    • Selectors(选择器): 使用单线程处理多个通道来减少线程的切换

      图解

    • Buffer(缓冲区): 数据的读写操作全部在缓冲区

优点:

  • 使用较少的线程便可以处理许多连接。因此减少了内存管理和上下文切换带来的时间消耗
  • 当没有I/O操作的时候线程池也可以被用于其他的工作

http://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-selector.html

https://www.cnblogs.com/nullzx/p/8932977.html

https://blog.csdn.net/u010412719/article/details/52819191