netty权威指南 (1-NIO入门)
NIO基础知识
Linux网络I/O模型简介
根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型
阻塞I/O模型
非阻塞I/O模型
I/O复用模型
select/poll 进程通过将一个或多个fd传递给select或poll系统调用I/O多路复用技术
支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)
I/O效率不会随着FD数目的增加而线性下降
使用mmap加速内核与用户空间的消息传递
无论是select、poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存复制就显得非常重要,epoll是通过内核和用户空间mmap同一块内存来实现的。
- epoll的API更加简单
信号驱动I/O模型
异步I/O
Java的I/O发展史
JDK1.4 NIO
NIO以JSR-51的身份正式随JDK发布,主要的类和接口如下:
- 进行异步I/O操作的缓冲区ByteBuffer等
- 进行各种I/O操作(异步或者同步)的Channel
- 多种字符集的编码能力和解码能力
- 实现非肌塞I/O操作的多路复用器selector
- 文件通道FileChannel
不完善的地方:
- 没有统一的文件属性(例如读写权限)
- API能力比较弱,例如目录的级联创建和递归遍历,往往需要自己实现
- 底层存储系统的一些高级API无法使用
- 所有的文件操作都是同步阻塞调用,不支持异步文件读写操作
JDK1.7 NIO2.0
- 增强文件处理
- 提供AIO,支持基于文件的异步I/O操作和针对网络套接字的异步操作
- 完成JSR-51定义的通道功能
java IO编程
传统的同步阻塞式I/O编程(BIO)
|
|
伪异步I/O编程
|
|
基于NIO的非阻塞编程
核心:Buffer,Channel,Selector
服务端序列图
|
|
基于NI02.0的异步非阻塞(AIO)编程
AsynchronousServerSocketChannel和AsynchronousSocketChannel,它们都由JDK底层的线程池负责回调并驱动读写操作。
正因为如此,基于NIO2.0新的异步非阻塞Channel进行编程比NIO编程更为简单。
各种回调函数,杂技的不行 -_-
不选择Java原生NIO编程的原因
使用麻烦
因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉
可靠性能力补齐,工作最和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题
JDK NIO的BUG,例如炅名昭著的epoll bug
转载请注明:转载自srzyhead的博客(https://srzyhead.github.io)
本文链接地址: netty权威指南 (1-NIO入门)