一、相关问题
1 | 什么是经典的三种I/O模式 |
2 | Netty对三种I/O模式的支持 |
3 | 为什么Netty仅支持NIO了? |
4 | 为什么Netty有多种NIO实现? |
5 | NIO一定优于BIO么? |
二、问题1:什么是经典的三种I/O模式
类比:
- 饭店->服务器
- 饭菜->数据
- 饭菜好了->数据就绪
- 端菜/送菜->数据读取
排队打饭模式 | BIO(阻塞I/O) | JDK1.4之前 |
点单、等待被叫模式 | NIO(非阻塞I/O) | JDK1.4(2022年,java.nio包) |
包厢模式 | AIO(异步I/O) | JDK1.7(2011) |
- 阻塞与非阻塞
- 菜没好,要不就死等->数据就绪前要不要等待?
- 阻塞:没有数据传输过来时,读会阻塞直到有数据;缓存区满时,写操作也会阻塞。非阻塞遇到这些情况,都是直接返回。
- 同步与异步
- 菜好了,谁端->数据就绪后,数据操作谁完成?
- 数据就绪后需要自己去读是同步,数据就绪后直接读好在回调是异步。
三、问题2:Netty对三种I/O模式的支持
四、问题3:为什么Netty仅支持NIO了?
- 为什么不建议(deprecate)阻塞I/O(BIO/OIO)?
连接数高的情况下:阻塞->耗资源、效率低
- 为什么删除已经做好的AIO支持?
- Windows实现成熟,但是很少用来做服务器。
- Linux常用来做服务器,但是AIO实现不够成熟
- Linux下AIO相比较NIO的性能提升不明显。
五、问题4:为什么Netty仅支持NIO了?
通用的NIO实现(Common)在Linux下使用的是epoll,为什么单独实现?实现的更好?
- Netty暴露了更多的可控参数,例如:
- jdk的NIO默认是水平触发
- Netty是边缘触发(默认)和水平触发可切换
- Netty实现的垃圾回收更少,性能更好。
六、问题5:NIO一定优于BIO么?
BIO代码简单
特定场景:连接数少,并发度低,BIO性能不输BIO