Blocking I/O
BIO顾名思义就是阻塞式IO的,accept、read、write三个方法都是阻塞的,这就造成一个问题,如果是单线程去处理BIO,那么线程必然大部分时间是挂起的,
为了能充分利用CPU,很自然就会想到开启多个线程去处理每一个连接。这样的设计在小规模的系统上的确可行,但是当单台机器要处理大量请求的时候,线程的数量就会成为很大的瓶颈。
线程是很贵的自然,java中一个线程默认需要开启1m的内存,加上线程切换,创建,销毁以及调度等等系统操作,可见线程是一种很贵的资源,所以通过增加线程来增加服务的并发量的代价是很高的。
Non-Blocking I/O
NIO中单个线程可以处理所有连接的建立、读写和关闭操作。
通过轮询Selector获取准备就绪的channel(select()方法是一个阻塞方法,所以不用担心while造成CPU空转),
针对不同的类型的channel做相应的读写操作,利用NIO,单线程就具备了处理所有I/O请求的能力,并最大程度上利用CPU资源
NIO.2
NIO.2 也叫AIO,实际上呢就是把NIO中的读写操作变成异步,当读写完成后再回调其对应的处理方法。在Windows中利用IOCP可以实现AIO,
但是在Linux上目前还没有支持AIO。