目录
1、 什么是经典的三种 I/O 模式 ?
1)阻塞与非阻塞
菜没好,要不要死等 -> 数据就绪前要不要等待?
阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞;非阻塞:遇到这些情况,都是直接返回。
2)同步与异步
菜好了,谁端 -> 数据就绪后,数据操作谁完成?
同步:数据就绪后需要自己去读;异步:数据就绪直接读好再回调给程序是;
2、Netty 对三种 I/O 模式的支持 ?
3、为什么 Netty 仅支持 NIO 了?
1)为什么不建议(deprecate)阻塞 I/O(BIO/OIO)?
•连接数高的情况下:阻塞 -> 耗资源、效率低
2)为什么删掉已经做好的 AIO 支持?
• Windows 实现成熟,但是很少用来做服务器。
• Linux 常用来做服务器,但是 AIO 实现不够成熟。
• Linux 下 AIO 相比较 NIO 的性能提升不明显 。
4、为什么 Netty 有多种 NIO 实现?
通用的 NIO 实现(Common)在 Linux 下也是使用 epoll,为什么自己单独实现?
实现得更好!
• Netty 暴露了更多的可控参数,例如:
• JDK 的 NIO 默认实现是水平触发
• Netty 是边缘触发(默认)和水平触发可切换
• Netty 实现的垃圾回收更少、性能更好
5、NIO 一定优于 BIO 么?
BIO 代码简单。 • 特定场景:连接数少,并发度低,BIO 性能不输 NIO。
6、Netty 怎么切换 I/O 模式?
从 NIO 切换到 OIO • 原理是:
• ServerSocketChannel:工厂模式+泛型+反射实现
• 服务器开发并不需要切换客户端对应NioSocketChannel
• ServerSocketChannel 负责创建对应的 SocketChannel 。