转载:https://blog.csdn.net/haogexiaole/article/details/86499782
BIO、NIO、AIO 的区别
在看BIO、NIO、AIO的区别之前,需要弄明白同步和异步以及阻塞和非阻塞。
同步和异步
同步是指发送一个请求,然后等待请求返回才能发送下一个请求,任务必须等待然后一个一个做。
异步是指发送一个请求,触发了IO之后,可以去发送下一个请求,任务无需等待,发送完请求可以做其他事了。
阻塞和非阻塞
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
BIO 同步阻塞I/O
BIO在工作时,当一个任务完成之后再去做另外一件任务,但是当系统需要同时完成很多任务的时候,就需要系统创建很多线程来完成对应的工作,因为BIO模型下一个线程同时只能做一个工作,如果线程在执行过程中依赖于需要等待的资源,那么该线程会长期处于阻塞状态,在cpu的不断切换中,会大大降低执行效率
NIO同步非阻塞I/O
在BIO模型中,如果需要并发处理多个I/O请求,那就需要多线程来支持,NIO使用了多路复用器机制,以socket使用来说,多路复用器通过不断轮询各个连接的状态,只有在socket有流可读或者可写时,应用程序才需要去处理它,在线程的使用上,就不需要一个连接就必须使用一个处理线程了,而是只是有效请求时(确实需要进行I/O处理时),才会使用一个线程去处理,这样就避免了BIO模型下大量线程处于阻塞等待状态。
AIO 异步非阻塞I/O
从编程模式上来看AIO相对于NIO的区别在于,NIO需要使用者线程不停的轮询IO对象,来确定是否有数据准备好可以读了,而AIO则是在数据准备好之后,才会通知数据使用者,这样使用者就不需要不停地轮询了。
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。