博客
关于我
Netty源码—3.Reactor线程模型三
阅读量:793 次
发布时间:2023-02-15

本文共 1264 字,大约阅读时间需要 4 分钟。

NioEventLoop的执行框架与处理机制

NioEventLoop作为Netty的核心事件循环框架之一,其执行机制涉及多个关键环节。以下将从事件循环的整体架构、事件轮询处理、任务处理等方面进行详细阐述。

一、事件循环的总体框架

NioEventLoop的运行机制可以分为三个主要环节:

  • Reactor线程所做的三件事情Reactor线程的主要工作包含以下三个部分:
    • 调用select()方法进行事件轮询
    • 处理轮询得到的IO事件
    • 执行外部线程提交到TaskQueue的任务
    1. IO事件处理与任务执行的时间比例NioEventLoop默认设置了一个ioRatio参数,值为50。这个参数决定了IO事件处理与任务执行的时间比例。具体来说,当ioRatio为50时,表示执行IO事件的时间与执行任务的时间是1:1的比例。当ioRatio为100时,表示完全专注于处理IO事件。

    2. NioEventLoop.run()方法的执行流程NioEventLoop.run()方法是一个无限循环,主要流程如下:

      • 调用select()方法执行事件轮询
      • 处理事件轮询结果
      • 执行外部提交的任务

      二、事件轮询的具体实现

      Reactor线程执行事件轮询的过程包含以下几个关键步骤:

    3. 设置wakeUp变量Reactor线程在每次执行select()方法前都会将wakenUp变量设置为false,标记新一轮循环的开始。

    4. 定时任务截止时间检查如果定时任务队列中的任务截止时间接近,Reactor线程会中断当前轮询,立即处理这些任务。

    5. 检查任务队列如果普通任务队列或定时任务队列存在任务,Reactor线程会立即中断当前轮询。

    6. 执行阻塞式select操作如果没有定时任务或普通任务,Reactor线程会执行阻塞式select操作,等待IO事件发生。

    7. 处理空轮询Bug为了防止JDK空轮询问题,NioEventLoop采用了一种计数机制,当连续执行非阻塞select操作超过一定次数后,会重建Selector以避免空轮询。

    8. 三、处理产生的IO事件

      当Reactor线程完成事件轮询后,会进入处理IO事件的阶段:

    9. selectedKeys的优化NioEventLoop通过反射优化了Selector的selectedKeys结构,将其从HashSet替换为数组实现,提升了IO事件处理效率。

    10. 处理IO事件对于每个产生的IO事件,Reactor线程会:

      • 取出SelectionKey
      • 获取对应的Channel
      • 根据事件类型进行相应处理
      • 调用ChannelHandler的相应方法
      1. 任务队列的处理在处理完IO事件后,Reactor线程会执行外部线程提交的任务,确保异步任务能够及时处理。
      2. 四、总结

        NioEventLoop的设计理念强调高效事件轮询与任务处理的平衡。通过优化selectedKeys结构和任务执行比例,Netty确保了事件循环的高效性和稳定性。这种设计特别适用于I/O密集型的网络应用场景,能够最大限度地利用CPU资源,同时避免空轮询问题带来的性能损失。

    转载地址:http://bvcfk.baihongyu.com/

    你可能感兴趣的文章
    Netty工作笔记0022---NIO快速入门--编写客户端
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0024---SelectionKey API
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0026---NIO 网络编程应用--群聊系统1---编写服务器1
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0028---NIO 网络编程应用--群聊系统3--客户端编写1
    查看>>
    Netty工作笔记0030---NIO与零拷贝原理剖析
    查看>>
    Netty工作笔记0032---零拷贝AIO内容梳理
    查看>>
    Netty工作笔记0033---Netty概述
    查看>>
    Netty工作笔记0034---Netty架构设计--线程模型
    查看>>
    Netty工作笔记0035---Reactor模式图剖析
    查看>>
    Netty工作笔记0036---单Reactor单线程模式
    查看>>
    Netty工作笔记0045---异步模型原理剖析
    查看>>
    Netty工作笔记0046---TaskQueue自定义任务
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0051---Netty核心模块2
    查看>>
    Netty工作笔记0052---Pipeline组件剖析
    查看>>
    Netty工作笔记0055---Unpooled应用实例1
    查看>>
    Netty工作笔记0056---Unpooled应用实例2
    查看>>