Netty
# 1.1 I/O基础入门
Java1.4之前对I/O的支持并不完善,给开发带来的问题有:
- 没有数据缓冲区,I/O性能存在问题
- 没有C/C++中channel的概念,只有输入输出流
- BIO会导致通信被长时间阻塞
- 支持的字符集优先,硬件移植性不好
# 1.1.1 linux网络I/O模型简介
linux中所有的外部设备都是一个文件,socket也是一个文件,有文件描述符(fd)指向它。 UNIX提供5中I/O模型:
- BIO模型:在进程空间调用recvfrom,直到有数据才返回。
- NIO模型:轮训调用recvfrom。
- I/O复用:linux提供select/poll,其支持多个fd的NIO,但是select/poll本身是阻塞的。epoll采用事件驱动的方式代替顺序扫描,其性能更高。
- 信号驱动I/O模型:
- 异步I/O:通知内核某个操作,并整个操作完成的时候通知我们。
# I/O多路复用技术
epoll优点:
- 支持一个进程打开的fd不受限制
- IO效率不会随着fd数量增加而下降
- 使用mmap加速内核和用户空间的消息传递
- epoll API更加简单
# 1.2 Java的IO演进
2011年JDK7发布:
- 提供了能批量获取文件属性的API
- 提供AIO功能
# 2.1 传统的BIO编程
CLient/Server模型中,Server负责绑定IP,启动监听端口;Client发起链接请求,经过三次握手建立连接,通过输入输出流进行同步阻塞式通信。
# 2.1.1 BIO通信模型图
通过Acceptor处理多个client连接请求,处理完成后销毁线程。 该模型的问题就是支持的线程数量有限。
# 2.2 伪异步IO模型
伪异步是为了解决BIO一个链路需要一个线程的问题。 通过一个线程池处理多个客户端的请求接入
- 线程的数量不会大量膨胀导致资源耗尽
- 问题是:没有解决同步IO导致的线程阻塞问题
# 2.3 NIO模型
# 2.3.1 NIO简介
缓冲区buf 本质是一个字节数组(ByteBuff),同时提供数据的结构化访问以及维护读写位置。
通道 channel channel是全双工的。 流是单向的。 多路复用 selector selector简单来说就是轮训注册在其上的channel,
# 2.3.2 NIO服务序列图
# 2.4 AIO
编辑 (opens new window)
上次更新: 2022/05/22, 00:01:01