网络IO通信(1)
对TCp 通信来说, 每个 TCP Socket 的内核中都有一个 发送缓冲区 和 接收缓冲区。
- 接受缓冲区: 把 数据 缓存到内核, 如哦 应用进程 一直没有调用 Socket read方法,那么数据会一直 缓存在 接受缓冲区。
- 发送缓冲区:进程调用Socket send 方法,一般情况下是 将 数据从 应用层的用户 Buffer 复制 到Socket 的 内核发送缓冲区,然后 send 就 返回(异步)。

BIO 同步阻塞IO
主要类: ServerSocket, Socket
阻塞的主要体现:
- 连接阻塞
- IO阻塞
一些场景:
- zookeeper 的leader 选举(主要是 节点数不多,基本不影响性能)
- nacos 的注册地址信息同步
NIO
把 连接阻塞和IO 阻塞改成 非阻塞

通过一个线程不断轮询来获得结果, 比较浪费cpu资源。
关键的类:
- Selector
- Channel
- Buffer
多路复用IO
本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符, 一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。
多路复用的方式:
- select
- poll
- epoll
多路复用的好处: 可以通过 把 多个 IO的阻塞复用到 同一个 select的阻塞上, 从而是的 系统在 单线程的情况下 可以同事处理 多个 客户端请求。
系统开销小

Reactor 模型
单线程 Reactor模型
把 响应IO事件 和业务处理进行分离,通过一个或者多个线程来处理IO事件,然后将就绪得到事件分发到业务处理handlers线程去 异步非阻塞处理。 (同一个线程处理)

关键类:
- Reactor:将IO事件分配给对应的Hander
- Acceptor: 处理客户端的连接请求
- Handlers: 执行 非阻塞 读写
问题:
handler 的执行是串行的,如果 handler 处理的线程阻,会导致 其他业务处理阻塞。
多线程单Reactor模型
针对 单线程单Reactor模型的问题, 用线程池 来处理 handler中的业务逻辑。

多线程多Reactor 模型
所谓的 主从Reactor模型

主要过程: 由 main reactor 来接受管理客户端的连接, 然后把 IO请求 交给 subReactor 处理。netty 是采用的这个模型
参考:
《Mic老师的IO 课程》

浙公网安备 33010602011771号