类比辅助理解
餐厅点餐
BIO : 一个客人来了, 就派一个服务员去;
NIO : 一个客人来了, 告诉他点好菜之后再叫服务员;
AIO : 一个客人来了, 给他一个本子, 把要点的菜写好了, 再叫服务员;
站在老板的立场,对服务员的效率的提升是差异明显的.
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。
同步阻塞IO (BIO)
阻塞方式,只有当读到了流或将流写入操作系统后,才会释放资源.
Thread-Per-Connection的缺点:
- Efficiency: Threading may lead to poor performance due to context switching, synchronization, and data movement [2];
- Programming simplicity: Threading may require complex concurrency control schemes;
- Portability: Threading is not available on all OS platforms.
同步非阻塞IO (NIO)
事件驱动思想,Reactor模式.
我们知道Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。如果用图来表达:
缺点:
- 复杂
- Channel共享, 如果出现长时间读写, 会影响其他chanel
- 数据的接收和发送都占用了用户态, 能否借助操作系统的异步读写
异步IO方式(AIO)
事件驱动思想, 采用Proactor模式.省去了NIO中程序要遍历事件通知队列(selector)的代价. 比如windows中IOCP和Linux中epoll实现的AIO。
总结
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。