1. 背景
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题。
2. BIO
即传统IO。JDK1.4之前,当网络连接采用BIO模式时,服务端和客户端的socket是一对一连接通信的,通信结束前会阻塞当前进程。因此并发需要开启多线程来实现,一旦面对大并发时就需要开启大量线程,从而造成服务器资源浪费。
特点:
- 有2个阻塞点:获取socket套接字、获取客户端输入流。
- 在没有优化BIO的前提下,1个服务端只能为1个客户端服务。
- 线程模型,通过多线程实现1个服务端为多个客户端服务。
- 多线程IO(伪异步)问题: 客户端:线程(IO)=N:N
3. NIO
NIO设计思想:单线程处理并发。
NIO两种实现方式:epoll(性能较优,linux已实现)、selector(linux和window都有实现)
应用:redis
参考
- BIO与NIO、AIO的区别:https://blog.youkuaiyun.com/skiof007/article/details/52873421
- 面试必问IO与NIO精讲(代码和理论讲解):https://www.bilibili.com/video/BV1eb411p7WV?from=search&seid=16491402583165942804
- NIO–(由浅入深)视频教程(偏向代码讲解):https://www.bilibili.com/video/av79126039/