文章目录
- 1.多路复用——select、poll、epoll底层原理
- 2.NIOReactor模型
- (1)单Reactor单线程模型
- (2)单Reactor多线程模型
- (3)主从Reactor多线程模型(Netty)
- 3.Netty核心组件
- (1)网络通信层
- (2)事件调度层
- (3)服务编排层
- 4.Netty工作流程
- 参考
在此之前,我撰写了一篇介绍BIO、NIO、AIO的博客。
在这篇博客中,我将进一步介绍Java IO模型的相关知识,和Netty框架的核心知识。
1.多路复用——select、poll、epoll底层原理
从操作系统层面来说,多路复用的实现涉及三个函数:
- select/poll函数的读写工作原理:
3和4表示读取数据
局限性:
需要将fd数据从用户空间拷贝至内核空间;
获取就绪文件描述符需要遍历fd数组,时间复杂度为O(n)。
- epoll工作原理:
2、4、5表示读取
解决了select和poll的两大局限性,能获得更高的执行效率。
- 使用场景分析:
当连接数较少,并且读写较为活跃时,使用select、poll能获得更好的性能;
当连接数较多,并且大多都不活跃时,使用epoll性能更好。
2.NIOReactor模型
(1)单Reactor单线程模型
只有一个线程来执行所有的任务,效率低下,并且也有可靠性问题。
(2)单Reactor多线程模型
相比于上一个模型,增加了线程池的支持,从一定程度上提升了并发效率,但是引入线程池可能会涉及到数据同步问题。Redis底层就是基于这种模型。
(3)主从Reactor多线程模型(Netty)
在上一个模型的基础上,一个Reactor变成了两个,主Reactor创建连接,从Reactor分发读写任务,能支持更高的并发量。Netty是基于这种模型。
3.Netty核心组件
(1)网络通信层
-
Bootstrap:
负责客户端启动并用来连接远程Netty Server。
不过不用Bootstrap,用websocket也可以。 -
ServerBootstrap:
负责服务端监听指定端口。 -
Channel:
完成网络通信的载体。
(2)事件调度层
-
EventLoopGroup:
线程池,负责接收IO请求,并分配线程执行任务。 -
EventLoop:
线程池中的线程。
(3)服务编排层
-
ChannelHandler:
通过指定的handler处理数据IO。 -
ChannelHandlerContext:
保存ChannelHandler的上下文。 -
ChannelPipeline:
将多个ChannelHandler链接在一起。
4.Netty工作流程
参考
https://www.bilibili.com/video/BV12V4y1r7kU?p=2&vd_source=b7379453017b92a8beb445062eadf332