Netty 核心源码解读 —— 开篇,爱了爱了

图片

select、poll、epoll 都是 I/O 多路复用的具体实现,关键点是当有 I/O 事件发生了,如何知道这个事件是哪个 I/O 的?select、poll、epoll 都是通过将当前进程加载到对应的 fd 中,当有 fd 事件发生,调用 fd 事件回调函数,唤醒对应进程。select/poll 与 epoll 不同的是,select/poll 是在用户态管理 fd 监听列表,这就需要 select/poll 先要把监听 fd 列表从用户态传到内核态,每当 fd 有事件,唤醒当前进程,遍历 fd 全部列表,检查就绪事件,再将 fd 全部列表从内核态传回用户态;而 epoll 是在内核态管理 fd 监听列表(采用红黑树存储),epoll 通过增量式操作监听 fd,每当 fd 有事件,唤醒当前进程,会将发生事件的 fd 插入 epoll 的就绪队列,这样 epoll 就不需要遍历 fd 全部列表,只需返回就绪队列的 fd。

epoll 有两种事件模式:水平触发(Level Triggered)、边缘触发(Edge Triggered)。LT 模式下,只要有数据到达内核,就会触发 fd 事件,如果用户线程不对这个 fd 进行操作,内核会不断的将 fd 事件从内核态传回用户态,select/poll 都是 LT 模式;ET 模式下,当 fd 有事件就绪后,epoll 会将发生事件的 fd 插入 epoll 的就绪队列,epoll 会认为用户线程已操作过 fd 事件,之后就不会再触发这个 fd 事件。

Netty 的 I/O 模型就是基于非阻塞 I/O 实现的,底层依赖的是 JDK NIO 框架的 Selector(多路复用器)。一个多路复用器 Selector 可以同时轮询多个 Channel,在 JDK1.5_update10 使用了 epoll 代替 select 后(解决最大连接句柄1024/2048的限制),只需要一个线程负责 Selector 的轮询,就可以接入成千上万的客户端。

2、Reactor 设计模式

随着 I/O 多路复用的出现,出现了很多事件处理模式。

我们已经知道了,I/O 多路复用可以复用一个或少量线程来获取多个数据通道的数据状态,当有数据处于就绪状态后,就会将就绪状态的事件分发给各读写事件的处理者,那么谁是这个事件分发者呢?这里就还需要有一个事件分发器(event dispather),它负责将读写事件源分发给对应的读写事件处理者(event handler),而涉及这个事件分发器的两种设计模式有:Reactor 和 Proactor,Reactor 采用同步 I/O, Proactor 采用异步 I/O。

Reactor 模式是将所有要处理的 I/O 事件注册到一个 I/O 多路复用器上,主线程阻塞在 I/O 多路复用器上,当有 I/O 事件准备就绪后(边沿触发或水平触发),I/O 多路复用器会将 I/O 事件通过事件分发器分发到对应的处理器中。

图片

Reactor 模式可以细分为 Reactor 单线程模式、Reactor 多线程模式和 Reactor 主从模式,在 Netty 采用的是 Reactor 主从模式,就是我们常说的 bossGroup 和 workerGroup,bossGroup 负责处理 socket I/O 的连接事件,workerGroup 负责处理 I/O 的读写事件。

3、Zero-copy 零拷贝

零拷贝,这个概念我最早是在学习消息队列时知道的,我们知道 Kafka 和 RocketMQ 都是文件存储设计架构,在 broker 上进行消息的投递。在传统模式下,拉取消息会先从磁盘中 read 后 copy 到内核态的 kernel 缓冲区,再 copy 到用户态,然后数据再从用户态 write 到内核态的 socket 缓冲,之后内核从网卡把数据发送出去,这里,数据在内核态与用户态之间一共进行了4次拷贝,以及进行了4次用户态与内核态间的上下文切换,所以,零拷贝技术就是来解决数据在内核态与用户态之间来回拷贝的问题。

零拷贝提供 mmap、sendfile 和 gather 三种方式。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

image.png

文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友

[外链图片转存中…(img-zT556ROg-1711778430066)]

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值