Netty源码解读-EventLoop(二)

news2025/7/20 13:23:30

一、简介

NioEventLoop的重要组成:Selector、线程、任务队列,他既会处理io事件,也会处理普通任务和定时任务.

1.下面是Selector,注意有两个哦后面会讲在这里插入图片描述
2.下面的爷爷类提供的Thread变量,其实下面发excutor用的就是这个一个线程。
任务队列就是thread上面的这个taskQueue变量
在这里插入图片描述
3.从曾祖父类中可以看到处理定时任务的任务队列
在这里插入图片描述

二、带着问题读源码

2.1selector在何时创建?

答案:在构造方法的openSelector()方法中被创建
在这里插入图片描述
在这里插入图片描述

2.2EventLoop为啥有两个Selector对象?

答案:为了在遍历SelectedKey时提升性能
继续往下看看openSelector方法:
在这里插入图片描述
SelectedSelectionKeySet的部分源码展现:
在这里插入图片描述
再看EventLoop构造方法就懂了:
1.selectorTuple 就是 new SelectorTuple(unwrappedSelector,new SelectedSelectionKeySetSelector(unwrappedSelector, selectedKeySet))
2.selectorTuple.selector就是new SelectedSelectionKeySetSelector(unwrappedSelector, selectedKeySet))
在这里插入图片描述
3.new SelectedSelectionKeySetSelector(unwrappedSelector, selectedKeySet))的底层可以看到,基本就是对unwrappedSelector进行了包装
在这里插入图片描述

2.3.EventLoop的Nio线程何时被启动?

答案:当首次调用execute方法时,通过state状态位控制线程只会启动一次

1.可以写一个测试代码,咱们追execute方法就行!

在这里插入图片描述
下面是其源码展示:
在这里插入图片描述

2.在inEventLoop的底层是通过thread变量和当前线程是否相等来判断是不是Nio线程

第一次执行时thread等于null,当然会返回false
在这里插入图片描述

3.随后通过addTask方法将任务提交到任务队列

在这里插入图片描述
在这里插入图片描述

4.第一次执行由于不属于nio线程,会执行startThread

在这里插入图片描述
在这里插入图片描述

2.4提交普通任务会不会结束select阻塞?

答案:会

1.重点追一下上面提及的run方法

在这里插入图片描述
发现netty的select底层是用了带超时时间的select方法
在这里插入图片描述

2.回到execute方法,分析后面的普通任务进来的执行逻辑

第二次execute方法进来,肯定是走下面这个wakeUp的逻辑
在这里插入图片描述
从底层可以看出wakeUp可以释放selector的select等待
在这里插入图片描述

2.5wakeup方法中的代码怎么理解? & wakenUp变量的作用是什么?

答案:只有其他线程提交任务时,才会调用上面2.4提到的selector.wakeup
wakenUp的作用:如果有多个其他线程都来提交任务,使用cas算法避免wakeUp被频繁调用

2.6每次循环时,什么时候会进入SelectStrategy.SELECT分支

答案:当没有任务时,才会进入SelectStrategy.SELECT分支,当有任务时,会调用selectNow方法,顺便拿到io事件
这得分析switch括号中方法的返回结果了,因为具体走哪个分支完全有这个case决定
在这里插入图片描述
由底层源码可知,档hasTasks()返回为fasle时,也就是没有任务才会走SELECT分支
在这里插入图片描述
如果有任务,则马上调用selector.selectNow把事件给拿到
在这里插入图片描述

2.7何时会select阻塞,阻塞多久?

答案:没有任务时阻塞一秒左右,只有三种情况才会跳出for的死循环:1.超时时间到了2.有任务3.有事件

在这里插入图片描述
在这里插入图片描述

2.8Nio空轮询bug在哪体现?如何解决?

答案:
1.bug的体现就是selector.select(timeout)方法可能没阻塞住,导致for循环一直空转(linux平台会产生)
2.解决办法是增加了selectCnt计数器,每次循环都会加1,默认达到512次就会认为bug产生,换一个新的selector,并会自动break
在这里插入图片描述
下面是for循环空转的终止条件,达到512次会重新创建一个新的selector,替换掉有问题的selector
在这里插入图片描述

2.9 ioRatio控制什么?设置为100有何作用?

答案:ioRatio控制处理io事件所占用的时间比例,如果设置100会让普通任务全部执行完(强烈不推荐!)。咱们可以看else的逻辑

由于Netty线程是单线程,如果处理普通任务的时间过长,势必会影响到io事件的处理
ioTime代表执行io事件处理耗费的时间
在这里插入图片描述

2.10selectedKeys优化是怎么回事?

答案:就是用数组类型的selectedKeys代替原来Set结构的SelectedKey,提升访问的效率

在上面2.2中提到了,selectedKeys是优化后数组类型的key集合,所以默认优化后会走if中的分支
在这里插入图片描述
继续追processSelectKeysOptimized方法,发现逻辑大致就是拿到nioChannel这个附件,执行其pipline中绑定的handler
在这里插入图片描述
processSelectedKey方法的底层是根据事件的类型做不同的处理
在这里插入图片描述

三、Netty中的Accept流程

原生nio中accept流程主要干了下面六件事情:
上面2.6-2.10已经分析到了前面三件事情,本段落时分析后续的三件事情在哪执行!
在这里插入图片描述

1.继续分析2.10中提到的unsafe.read(),这里会调到NioMessageUnsafe类中,我们关注doReadMessage这个方法即可

在这里插入图片描述
doReadMessages方法中可以看到nio原生的accept的过程,并主动创建了一个NioSocketChannel。而设置为非阻塞的过程在new NioSocketChannel方法中,有兴趣的朋友可以追一下
在这里插入图片描述

2.回到unsafe.read方法,往下继续看

这个pipeline.fireChannelRead就会调用到Netty源码解读-server端中2.3.3提到的acceptHandler
在这里插入图片描述
也就是会调用到ServerBootstrapAcceptor.channelRead,主要是设置一些参数,然后执行regitster方法
在这里插入图片描述
childGroup.register这个方法和Netty源码解读-server端中2.3.1的register的过程基本一致,也会切换成nio线程执行register0方法

在这里插入图片描述
在这里插入图片描述

继续分析pipeline.fireChannelActive,他势必也会执行head节点的active方法,又是熟悉的配方
在这里插入图片描述
又是在AbstractNioChannel.doBeginRead方法中关注到read事件
在这里插入图片描述

3.read事件触发

虽然该事件也会走2.10中提到的unsafe.read(),但和accept事件不同,他会进入NioByteUnsafe子类
会在doReadBytes方法中读取client端发送过来的数据,可以打断点看到经过这一行,byteBuf读指针发生了变化
在这里插入图片描述
后续的逻辑是通知其他的hander,链式执行…
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2中defineProperty和vue3中proxy区别

区别一:defineProperty 是对属性劫持,proxy 是对代理对象 下面我们针对一个对象使用不同的方式进行监听,看写法上有什么不同。 // 原始对象 const data {name: Jane,age: 21 }defineProperty defineProperty 只能劫持对象的某一个属性&…

TCP核心机制详解(三)

目录 前言: 滑动窗口 滑动窗口处理丢包问题 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 小结: 前言: 前两篇文章讲述了,TCP十种核心机制的前三种。这篇文章详细介绍其他的一些核心机制,让我们…

大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害怎样解决?

大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物(特别是红树林、盐沼和海草&…

企企通持续助力全球管道预制先行者「迈科管道」,二期项目逐步启动

近日,国内管道预制龙头企业「济南迈科管道科技有限公司」签约企企通采购供应链系统二期项目。此次签约,将针对迈科管道的采购业务特点和需求,结合企企通采购与供应链管理系统优势和丰富的实战经验,在一期项目基础上,持…

山东科技大学校历 代码分析 获得以前学期学年的老版校历

校历-山东科技大学网络安全与信息化办公室http://tech.sdust.edu.cn/wlfw/xl.htm JavaScript var studyStart new Date(2021, 8-1, 30);//8-1 -1没有意义,30代表30号,2021年8月30号开始这个学期 var commonWeeks 19;//这个学期有多少周 var s…

Mysql使用规范(纯技术和实战建议)

1、事务隔级别: (强制):Repeatable-Read(重复读),且不能在会话操作时临时开启隔离级别。 注: Repeatable-Read(重复读)隔离级别解决不了幻读。 可用 show variables l…

Linux学习之环境变量

目录环境变量基本概念查看环境变量的方法常见的环境变量PATH:指定命令的搜索路径。PATH测试HOME:指定用户的主工作目录SHELL:当前Shell和环境变量有关的命令环境变量的组织方式通过代码来获得环境变量通过函数来获得环境变量环境变量具有全局…

集成AI智能安防平台EasyCVR时,调取录像接口报跨域错误的解决方法

EasyCVR视频融合平台基于云边端架构,可支持海量视频汇聚管理,能提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等视频服务。平台兼容性强,支持多协议、多类型设备接入,包括:国标G…

Datawahle组队学习——妙趣横生大数据 Day1

妙趣横生大数据 Day1[妙趣横生大数据 Juicy Big Data](https://datawhalechina.github.io/juicy-bigdata/#/?id妙趣横生大数据-juicy-big-data)一、大数据概述大数据——第三次信息化浪潮大数据概念大数据应用大数据关键技术二、Hadoop背景介绍特性项目架构实验1. 准备工作2. …

Tomcat 配置IPV6

文章目录一、场景二、tomcat开启ipv6三、ipv6环境配置四、访问总结一、场景 我们在linux下安装一个tomcat,启用ipv6的方式,然后在windows下用浏览器访问这个tomcat 二、tomcat开启ipv6 在server.xml配置文件的里面加上 address”[::]” ,这…

选择排序、快速排序、插入排序等经典八大算法稳定性分析

选择排序、快速排序、插入排序等经典八大算法稳定性分析稳定性定义:各排序算法的稳定性:一、冒泡排序二、选择排序三、插入排序四、快速排序五、归并排序六、希尔排序(shell)七、基数排序 :八、堆排序常用排序算法对比稳定性定义:…

代码的简单设计五原则

欢欢:“你看我的代码用了策略模式和状态模式,假如后面客户会有这样的需求,可以无缝扩展,多么健壮!” 清扬一脸狐疑,心中念叨了数遍 :“哼,过度设计!”,只见她…

APISpace 带你一起走进西湖美景

俗话说:“上有天堂,下有苏杭”。 “欲把西湖比西子,浓妆艳抹总相宜” 今天我就带大家走进杭州的西湖美景。自古以来,文人歌者面对西湖美景留下千古绝句,还以西湖为背景书写了一段段动人的爱情传说。 天生自带浪漫色…

医学生考研考博太卷,一篇文章轻松助力上岸——生物信息学及R语言基础知识之向量的运算(二)

考研考博太卷了,卷不过,想没想过本科发一篇文章呢? 330分考研人淘汰390分考研人这个故事,大家应该都知道吧。 本专栏带你六个月内,搞定一篇文章,本科生发文章也很容易。 在卷考研的同时,再卷一篇SCI,你就是新一任卷王。 本专栏教你不用花钱发一篇生信文章,从三个方…

态库、静态库之间的相互嵌套

本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。 一、内容包含: ①静态库libbb.a依赖静态库libaa.a的测试; …

学会分享,学会生活,分享5款简单易用的软件。

分享是一种博爱的心境,学会分享,就学会了生活。 1.在线图片编辑工具——佐糖 佐糖是一款在线免费图片编辑工具,采用AI人工智能技术,自动识别图片,支持一键抠图,更换背景,移除水印等。另外还提…

【向每个应用View中增加子控件 Objective-C语言】

一、把刚才计算九宫格的思路再给大家过一遍 1.现在我们要计算九宫格坐标 1)先把每一个格子,每一个九宫格的大小,先确定了, 在这里先指定宽和高 CGFloat appW = 75; CGFloat appH = 90; 2)再去计算第一个格子的一些间距, 到上面的间距,marginTop = 30; 再计算出…

别再花钱买 Chatgpt 资源了,这里有免费的,2 分钟上手

最近无论是打开社交网站,还是朋友圈,就连中午吃个饭都能听到大家都在聊 ChatGPT,仿佛如果这一刻你不懂这是个啥玩意儿,你就会觉得自己完全搭不上他们的话... 那ChatGPT 是什么? 百度上是这样解释的: ChatG…

最全的免费录屏工具,这 19 款录屏软件绝对值得你收藏

屏幕录制软件可让您捕获屏幕以与他人共享,创建与产品相关的视频、教程、课程、演示、视频等。这些软件是您能够从网络摄像头和屏幕录制视频。以下是精选的顶级屏幕录像机列表。 适用于 PC 的19 款免费录屏屏幕录像机软件 1)奇客免费录屏 奇客免费录屏&am…

2023家用投影仪怎么选?极米H5值得推荐

如今不管是手机还是电视都在不断向大屏幕靠近,消费者也在追求越来越大的屏幕尺寸。同时作为提升生活幸福指数的重要家居用品,投影仪正逐渐取代电视,成为消费者的首选。随着国内智能投影行业的不断发展,市面上智能投影产品也越来越…