smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型

文章目录

  • 1.多路复用——select、poll、epoll底层原理
  • 2.NIOReactor模型
    • (0)关于Reactor模型和AIO的区别
    • (1)单Reactor单线程模型
    • (2)单Reactor多线程模型
    • (3)主从Reactor多线程模型(Netty)
  • 3.Netty核心组件
    • (1)网络通信层
    • (2)事件调度层
    • (3)服务编排层
  • 4.Netty工作流程
  • 参考

在此之前,我撰写了一篇介绍BIO、NIO、AIO的博客。

在这篇博客中,我将进一步介绍Java IO模型的相关知识,和Netty框架的核心知识。

1.多路复用——select、poll、epoll底层原理

从操作系统层面来说,多路复用的实现涉及三个函数:

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第1张图片

  • select/poll函数的读写工作原理(NIO):
    3和4表示读取数据
    smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第2张图片

局限性:
需要将fd数据从用户空间拷贝至内核空间;
获取就绪文件描述符需要遍历fd数组,时间复杂度为O(n)。

  • epoll工作原理(AIO、Netty):
    2、4、5表示读取
    smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第3张图片

解决了select和poll的两大局限性,能获得更高的执行效率。

  • 使用场景分析:
    当连接数较少,并且读写较为活跃时,使用select、poll能获得更好的性能;
    当连接数较多,并且大多都不活跃时,使用epoll性能更好。

2.NIOReactor模型

(0)关于Reactor模型和AIO的区别

  • 什么是Reactor模型:

Reactor模型是一种基于事件驱动的并发编程模型,用于处理多个客户端请求。

Reactor模型的基本思想是将I/O事件的处理分离成两个阶段:事件分发和事件处理。事件分发器(Dispatcher)用于监听所有的I/O事件,当有事件发生时,它会将事件分发给相应的事件处理器(Handler)进行处理。事件处理器负责具体的事件处理,包括读取和写入数据、解析请求、执行业务逻辑等。在Reactor模型中,事件处理器通常是异步的、非阻塞的,使得系统能够同时处理多个客户端请求,提高了系统的并发性能。

Reactor模型的主要优点是提高了系统的并发性能和可扩展性,同时也避免了线程创建和销毁等开销。在实际应用中,Reactor模型被广泛应用于网络编程、数据库系统、操作系统等领域。在网络编程中,Reactor模型常被用于实现高性能的服务器,如Web服务器、消息服务器等。在数据库系统中,Reactor模型可以用于实现高性能的I/O操作,如Redis就是使用了Reactor模型来实现高效的I/O操作。在操作系统中,Reactor模型可以用于实现高性能的文件系统、网络协议栈等组件。

  • 事件驱动和AIO有什么区别:

事件驱动的I/O模型(Event-driven I/O Model)是一种高效的I/O处理模型,主要用于处理多个I/O事件。在事件驱动的I/O模型中,程序会监听多个I/O事件,并在事件发生时触发相应的处理程序进行处理,而不是等待I/O操作完成。 这种模型避免了阻塞式I/O操作可能带来的性能问题,同时也提高了系统的并发性能。

(1)单Reactor单线程模型

只有一个线程来执行所有的任务,效率低下,并且也有可靠性问题。

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第4张图片

(2)单Reactor多线程模型

相比于上一个模型,增加了线程池的支持,从一定程度上提升了并发效率,但是引入线程池可能会涉及到数据同步问题。Redis底层就是基于这种模型。

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第5张图片

(3)主从Reactor多线程模型(Netty)

在上一个模型的基础上,一个Reactor变成了两个,主Reactor创建连接,从Reactor分发读写任务,能支持更高的并发量。Netty是基于这种模型。
smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第6张图片

3.Netty核心组件

(1)网络通信层

  • Bootstrap:
    负责客户端启动并用来连接远程Netty Server。
    不过不用Bootstrap,用websocket也可以。

  • ServerBootstrap:
    负责服务端监听指定端口。

  • Channel:
    完成网络通信的载体。

(2)事件调度层

  • EventLoopGroup:
    线程池,负责接收IO请求,并分配线程执行任务。

  • EventLoop:
    线程池中的线程。

(3)服务编排层

  • ChannelHandler:
    通过指定的handler处理数据IO。

  • ChannelHandlerContext:
    保存ChannelHandler的上下文。

  • ChannelPipeline:
    将多个ChannelHandler链接在一起。

4.Netty工作流程

smart Java——Netty实战(上):select/poll/epoll、NIOReactor模型_第7张图片

参考

https://www.bilibili.com/video/BV12V4y1r7kU?p=2&vd_source=b7379453017b92a8beb445062eadf332

你可能感兴趣的:(smart,JAVA,java,netty,I/O模型)