网络IO通信(1)

对TCp 通信来说, 每个 TCP Socket 的内核中都有一个 发送缓冲区 和 接收缓冲区。

  • 接受缓冲区: 把 数据 缓存到内核, 如哦 应用进程 一直没有调用 Socket read方法,那么数据会一直 缓存在 接受缓冲区。
  • 发送缓冲区:进程调用Socket send 方法,一般情况下是 将 数据从 应用层的用户 Buffer 复制 到Socket 的 内核发送缓冲区,然后 send 就 返回(异步)。

image

BIO 同步阻塞IO

主要类: ServerSocket, Socket

阻塞的主要体现:

  • 连接阻塞
  • IO阻塞

一些场景:

  • zookeeper 的leader 选举(主要是 节点数不多,基本不影响性能)
  • nacos 的注册地址信息同步

NIO

把 连接阻塞和IO 阻塞改成 非阻塞

image

通过一个线程不断轮询来获得结果, 比较浪费cpu资源。

关键的类:

  • Selector
  • Channel
  • Buffer

多路复用IO

本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符, 一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。

多路复用的方式:

  • select
  • poll
  • epoll

多路复用的好处: 可以通过 把 多个 IO的阻塞复用到 同一个 select的阻塞上, 从而是的 系统在 单线程的情况下 可以同事处理 多个 客户端请求。

系统开销小

image

Reactor 模型

单线程 Reactor模型

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

image

关键类:

  • Reactor:将IO事件分配给对应的Hander
  • Acceptor: 处理客户端的连接请求
  • Handlers: 执行 非阻塞 读写

问题:

handler 的执行是串行的,如果 handler 处理的线程阻,会导致 其他业务处理阻塞。

多线程单Reactor模型

针对 单线程单Reactor模型的问题, 用线程池 来处理 handler中的业务逻辑。

image

多线程多Reactor 模型

所谓的 主从Reactor模型

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

参考:

《Mic老师的IO 课程》

posted @ 2022-12-24 15:37  小烽  阅读(126)  评论(0)    收藏  举报