简单解析Netty模型的执行流程

本文深入解析Netty的零拷贝实现,包括DirectByteBuf、CompositeByteBuf和DefaultFileRegion,并探讨Netty为何选择NIO而非AIO。接着详细介绍了Netty的服务端和客户端线程模型,包括EventLoopGroup、Acceptor线程和IO线程的工作流程,最后阐述了NioEventLoop的设计原理,强调其串行化设计避免线程竞争的特点。
摘要由CSDN通过智能技术生成

首先解释一下Netty的零拷贝体现在何处?

Netty的零拷贝主要体现在三个方面:

第一种实现:DirectByteBuf   直接内存缓冲区
就如上所说,ByteBuf可以分为HeapByteBuf和DirectByteBuf,当使用DirectByteBuf可以实现零拷贝

第二种实现:CompositeByteBuf   复合缓冲区
CompositeByteBuf将多个ByteBuf封装成一个ByteBuf,对外提供封装后的ByteBuf接口

第三种实现:DefaultFileRegion  
DefaultFileRegion是Netty的文件传输类,它通过transferTo方法将文件直接发送到目标Channel,而不需要循环拷贝的方式,提升了传输性能

为什么Netty使用NIO而不是AIO?

  1. Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层不容易深度优化
  2. Netty整体架构是reactor模型, 而AIO是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来
  3. AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多
  4. Linux上AIO不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈(待验证)

Netty线程模型

服务端线程模型

第一步:从用户线程起发起创建服务端操作,代码如下:【用户线程创建服务端代码示例】

NioEventLoopGroup boss=new NioEventLoopGroup(1);
        NioEventLoopGroup worker=new NioEventLoopGroup();

        try {

            //服务端启动辅助类,主要作用就是将接收连接和用户逻辑处理相关的配置进行初始化
            ServerBootstrap bootstrap=new ServerBootstrap()
                    //将主/工作EventLoopGroup进行配置
                    .group(boss,worker
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值