Java IO 模型演进
从最早的阻塞 IO 到如今高性能网络框架 Netty,Java IO 模型的演进代表了网络编程思想的一次次革命。
一、前置知识:用户态与内核态
- 1.1 系统调用与上下文切换的代价
- 1.2 同步/异步、阻塞/非阻塞的区分
- 1.3 两对概念的交叉矩阵
二、BIO(Blocking IO)
- 2.1
ServerSocket+Socket的工作原理 - 2.2 一连接一线程模型的弊端——C10K 问题
- 2.3 线程池的缓解——但治标不治本
- 2.4 BIO 的适用场景——连接数少、数据量大的场景
三、NIO(Non-blocking IO / New IO)
- 3.1 Channel——双向通道,替代 Stream
- 3.2 Buffer——position / limit / capacity 三剑客
- 3.3 Selector——多路复用的核心
- 3.4
select()/poll()/epoll()系统调用对比 - 3.5 NIO 编程的复杂性——就绪事件的循环处理
四、AIO(Asynchronous IO)
- 4.1 基于回调的异步 IO
- 4.2
AsynchronousServerSocketChannel的使用 - 4.3 AIO 为什么没有流行——Linux 实现不完善
五、Reactor 模型
- 5.1 单 Reactor 单线程
- 5.2 单 Reactor 多线程
- 5.3 主从 Reactor 多线程——Netty 的实现
- 5.4 每种模型的架构图
六、Netty 的核心设计
- 6.1 Channel / EventLoop / EventLoopGroup
- 6.2 Pipeline 与 ChannelHandler 责任链
- 6.3 ByteBuf——Netty 的数据容器
- 6.4 零拷贝——
FileRegion/CompositeByteBuf
七、Netty 简单 Demo
- 7.1 Echo Server / Client 的实现
- 7.2 编解码器——
StringEncoder/StringDecoder - 7.3 心跳检测——
IdleStateHandler
八、总结
- BIO → NIO → Netty 不仅是 API 的升级,更是编程模型的转变
- 选择建议:绝大多数场景用 Netty,简单场景可用 BIO
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!