BIO NIO AIO

BIO NIO AIO

BIO,同步阻塞式IO,简单理解:一个链接一个线程
NIO,同步非阻塞IO,简单理解:一个请求一个线程
AIO,异步非阻塞IO,简单理解:一个有效请求一个线程

BIO(同步阻塞)

在JDK1.4以前,用Java编写网络请求,都是创建一个ServerSocket
客户端创建Socket时就会询问是否有线程能够处理,若是没有,要么等待,要么被拒绝。

即:一个链接,要求Server对应一个处理线程。

NIO(同步非阻塞)

在Java里的由来,在JDK1.4及之后版本中提供了一套API来专门操做非阻塞I/O,咱们能够在java.nio包及其子包中找到相关的类和接口。

这套API由三个主要的部分组成:
    缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。

NIO自己是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题:

    在使用同步I/O的网络应用中,若是要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通信,就必须使用多线程来处理。
    也就是说,将每个客户端请求分配给一个线程来单独处理。

    这样作虽然能够达到咱们的要求,但同时又会带来另一个问题:
        因为每建立一个线程,就要为这个线程分配必定的内存空间(也叫工做存储器),并且操做系统自己也对线程的总数有必定的限制。
        若是客户端的请求过多,服务端程序可能会由于不堪重负而拒绝客户端的请求,甚至服务器可能会所以而瘫痪。


NIO(同步非阻塞):
    服务器实现模式为一个请求一个线程,
    即客户端发送的链接请求都会注册到多路复用器上,多路复用器轮询到链接有I/O请求时才启动一个线程进行处理。

AIO(异步非阻塞)

与NIO不一样,当进行读写操做时,只须直接调用API的read或write方法便可。

这两种方法均为异步的:

    对于读操做而言,当有流可读取时,操做系统会将可读的流传入read方法的缓冲区,并通知应用程序

    对于写操做而言,当操做系统将write方法传递的流写入完毕时,操做系统主动通知应用程序。 

    便可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。