IO
I/O前言——五种IO通信模型
多路复用IO模型
I/O多路复用模型 select
I/O多路复用模型 poll
I/O多路复用 epoll
Linux实现
Linux I/O 多路复用 epoll
BIO
BIO示例
BIO实现
1. 执行ServerSocket构造函数
2. BIO ServerSocket.accept()等待客户端请求
BIO ServerSocket.accept()等待客户端请求
BIO组件
ServerSocket
Socket
SocksSocketetImpl
windows平台组件
PlainSocketImpl
DualStackPlainSocketImpl
DualStackPlainSocketImpl 本地方法的各种封装
InetSocketAddress
InetSocketAddress 封装套接字信息(IP+端口)
NIO
NIO总结文——一篇读懂NIO整个流程
NIO示例
NIO服务端工作过程
1. NIO服务端准备工作
2. this.selector.select()查找到来的感兴趣事件
3. 感兴趣的事件到来
组件
SelectorProvider
SelectorProviderImpl
Selector
Channel
ServerSocketChannel
ServerSocketChannel 与 ServerSocket的比较
ServerSocketChannel 与 ServerSocket的比较
ServerSocketChannelImpl
SocketChannelImpl
FileChannel
SelectionKey
NIO组件 Selector之 SelectionKey 、 SelectionKeyImpl
Pipe
Net
NIO客户端(粗略)
NIO 客户端创建Channel
NIO 客户端发起连接
思考
从BIO到NIO、再到Netty
知识点的梳理
NIO
线程关系
在上文NIO示例中,仅仅只有一个main线程并没有创建额外线程,也就是说Selector、Channel处理在同一个线程,通过Selector实现轮询的NIO有如下特点:
- 单线程处理多通道通信
- select方法阻塞(使得处理Channel中的事件通过同步实现)
这种经典NIO方式和BIO相比最大的意义在于将面向连接处理改变为面向事件处理。
Selector、Channel处理在同一个线程这样做依然是具有优化空间的,也就是在Selector的基础上加入多线程处理,此时的多线程处理和BIO的多线程处理已经意义不同,对于额外线程的使用会更有效。
Channel的意义
在BIO实现中,流和Socket直接连接,你可以理解为:
一个水龙头的一方是水源(客户端),另一方是一个人(服务端),这个人要喝水,但是没有器皿,所以只能一直在水龙头下等待未知的水源输送,即使这会没有水,人还是要等待,因为必须要保证能够接收水源。
BIO就是这样的,BIO可以实现非阻塞,但是BIO最大的问题在于流直接与Socket通信。
我们之前分析NIO是块编程,其实就是BIO的基础上加入缓存实现
NIO 零拷贝
拓展
NIO Buffer
TODO