什么是经典的三种 I/O 模式?
生活场景:
当我们去饭店吃饭时:
• 食堂排队打饭模式:排队在窗口,打好才走;
• 点单、等待被叫模式:等待被叫,好了自己去端;
• 包厢模式:点单后菜直接被端上桌。
• 阻塞与非阻塞
1) 菜没好,要不要死等 -> 数据就绪前要不要等待?
2) 阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满时,写操作也会阻塞。
非阻塞遇到这些情况,都是直接返回。
• 同步与异步
1) 菜好了,谁端 -> 数据就绪后,数据操作谁完成?
2) 数据就绪后需要自己去读是同步,数据就绪直接读好再回调给程序是异步。
Netty 对三种 I/O 模式的支持如图:
为什么 Netty 有多种 NIO 实现?
通用的 NIO 实现(Common)在 linux 下也是使用 epoll,为什么自己单独实现?
实现得更好!
• Netty 暴露了更多的可控参数,例如:
JDK 的 NIO 默认实现是水平触发
Netty 是边缘触发(默认)和水平触发可切换
• Netty 实现的垃圾回收更少、性能更好
NIO 一定优于 BIO 么?
• BIO 代码简单。
• 特定场景:连接数少,并发度低,BIO 性能不输 NIO。
什么是 Reactor 及三种版本?
生活场景:饭店规模变化
• 一个人包揽所有:迎宾、点菜、做饭、上菜、送客等;
• 多招几个伙计:大家一起做上面的事情;
• 进一步分工:搞一个或者多个人专门做迎宾。
1. 一个人包揽所有:迎宾、点菜、做饭、上菜、送客等 -> Reactor 单线程
2. 多招几个伙计:大家一起做上面的事情 -> Reactor 多线程模式
3. 进一步分工:搞一个或者多个人专门做迎宾 -> 主从 Reactor 多线程模式
Reactor 及三种版本 对应设计大图(网络上到处都有 直接拿来用哈哈)