Netty面试题(一)

2023-09-19 18:40:35


前言

  1. BIO、NIO 和 AIO 的区别?
  2. NIO 的组成?
  3. Netty 的特点?

一、BIO、NIO 和 AIO 的区别?

  1. BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。
  2. 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。
  3. NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。
  4. AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理,
  5. BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO的 Stream 是单向的,而 NIO 的 channel 是双向的。
  6. NIO 的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再阻塞,而是返回 0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。
    在 Reactor 模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。如在 Reactor 中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事件、事件到来,激活分发器,分发器调用事件对应的处理器、事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

二、NIO 的组成?

  1. Buffer:与 Channel 进行交互,数据是从 Channel 读入缓冲区,从缓冲区写入Channel 中的
  2. flip 方法 : 反转此缓冲区,将 position 给 limit,然后将 position 置为 0,其实就是切换读写模式
  3. clear 方法 :清除此缓冲区,将 position 置为 0,把 capacity 的值给 limit。
  4. rewind 方法 : 重绕此缓冲区,将 position 置为 0
  5. DirectByteBuffer 可减少一次系统空间到用户空间的拷贝。但 Buffer 创建和销毁的成本更高,不可控,通常会用内存池来提高性能。直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。如果数据量比较小的中小应用情况下,可以考虑使用 heapBuffer,由 JVM 进行管理。
  6. Channel:表示 IO 源与目标打开的连接,是双向的,但不能直接访问数据,只能与 Buffer进行交互。通过源码可知,FileChannel 的 read 方法和 write 方法都导致数据复制了两次!Selector 可使一个单独的线程管理多个 Channel,open 方法可创建 Selector,register 方法向多路复用器器注册通道,可以监听的事件类型:读、写、连接、accept。注册事件后会产生一个 SelectionKey:它表示 SelectableChannel 和 Selector 之间的注册关系,wakeup 方法:使尚未返回的第一个选择操作立即返回,唤醒的原因是:注册了新的 channel 或者事件;channel 关闭,取消注册;优先级更高的事件触发(如定时器事件),希望及时处理。
  7. Selector 在 Linux 的实现类是 EPollSelectorImpl,委托给 EPollArrayWrapper 实现,其中三个native 方法是对 epoll 的封装,而 EPollSelectorImpl. implRegister 方法,通过调用 epoll_ctl向 epoll 实例中注册事件,还将注册的文件描述符(fd)与 SelectionKey 的对应关系添加到fdToKey 中,这个 map 维护了文件描述符与 SelectionKey 的映射。
  8. fdToKey 有时会变得非常大,因为注册到 Selector 上的 Channel 非常多(百万连接);过期或失效的 Channel 没有及时关闭。fdToKey 总是串行读取的,而读取是在 select 方法中进行的,该方法是非线程安全的。
  9. Pipe:两个线程之间的单向数据连接,数据会被写到 sink 通道,从 source 通道读取
  10. NIO 的服务端建立过程:Selector.open():打开一个 Selector ServerSocketChannel.open():创建服务端的 Channel;bind():绑定到某个端口上。并配置非阻塞模式;register():注册Channel 和关注的事件到 Selector 上;select()轮询拿到已经就绪的事件

三、Netty 的特点?

一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持
使用更高效的 socket 底层,对 epoll 空轮询引起的 cpu 占用飙升在内部进行了处理,避免了直接使用 NIO 的陷阱,简化了 NIO 的处理方式。
采用多种 decoder/encoder 支持,对 TCP 粘包/分包进行自动化处理
可使用接受/处理线程池,提高连接效率,对重连、心跳检测的简单支持
可配置 IO 线程数、TCP 参数, TCP 接收和发送缓冲区使用直接内存代替堆内存,通过内存
池的方式循环利用 ByteBuf
通过引用计数器及时申请释放不再引用的对象,降低了 GC 频率
使用单线程串行化的方式,高效的 Reactor 线程模型
大量使用了 volitale、使用了 CAS 和原子类、线程安全类的使用、读写锁的使用


总结

  1. BIO、NIO 和 AIO 的区别?
  2. NIO 的组成?
  3. Netty 的特点?
更多推荐

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日,沪指盘中震动下探,一度跌近1%逼近3100点,尾盘逐步止跌;深成指、创业板指均跌超1%。截至收盘,沪指跌0.45%报3123.07点,深成指跌1.14%报10255.87点,创业板指跌1.14%报2027.73点,科创50指数跌1.39%;两市合计成交6982亿元,北向资金净卖出近66亿元。行业方面,软件、轿车、

如何利用Java实现 AI 人脸融合特效

Java实现AI人脸融合特效项目背景AI人脸融合特效的原理代码实现第一步:调用token接口人脸融合部分工具类最终效果图项目背景最近自从chat-gpt爆火以来,AI技术在人工智能领域持续迭代的创新,为人们的生活带来了许多震撼的应用。比如其中的,AI人脸融合特效,在各大抖音、B站等平台上,越来越火热,基于这,我也打算利

使用 Next.js、Langchain 和 OpenAI 构建 AI 聊天机器人

在当今时代,将AI体验集成到您的Web应用程序中变得越来越重要。LangChain与Next.js的强大功能相结合,提供了一种无缝的方式来将AI驱动的功能引入您的应用程序。在本指南中,我们将学习如何使用Next.js,LangChain,OpenAILLM和VercelAISDK构建AI聊天机器人。文章目录Langch

细说 Spring Cloud Gateway

1.SpringCloudGateway简介与核心概念在微服务架构中,API网关是一个非常重要的组件,它可以帮助我们实现服务的路由、负载均衡、认证授权等功能。SpringCloudGateway是SpringCloud官方推出的一个基于Spring5、SpringBoot2和ProjectReactor的API网关实现

Linux centOS yum install MySQL5.7

下载并安装MySQLYUM仓库wgethttps://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmsudoyumlocalinstallmysql57-community-release-el7-11.noarch.rpm这将为您的CentO

PKE 安全性的提升方式:Naor-Yung、Fischlin、Fujisaki-Okamoto

参考文献;[NY90]NaorM,YungM.Public-keycryptosystemsprovablysecureagainstchosenciphertextattacks[C]//Proceedingsofthetwenty-secondannualACMsymposiumonTheoryofcomputin

深入解析Perlin Simplex噪声函数:在C++中构建现代、高效、免费的3D图形背景

引言在计算机图形中,噪声是一个经常被讨论的话题。无论是为了制造自然的纹理,还是为了模拟复杂的现实世界现象,噪声函数都在其中起着关键作用。而在众多噪声函数中,PerlinSimplex噪声无疑是最受欢迎的一种。其原因不仅在于其干净、快速的特性,更因为其所提供的连续性和一致性非常适合图形渲染。本文将为你展示如何在C++中实

8路光栅尺磁栅尺编码器或16路高速DI脉冲信号转Modbus TCP网络模块 YL99-RJ45

特点:●光栅尺磁栅尺解码转换成标准ModbusTCP协议●高速光栅尺磁栅尺4倍频计数,频率可达5MHz●模块可以输出5V的电源给光栅尺或传感器供电●支持8个光栅尺同时计数,可识别正反转●可以设置作为16路独立DI高速计数器●可网页直接查看所有数据无需其他软件●编码器计数值和DI计数都支持断电自动保存●DI输入和网络通信

每天几道Java面试题:集合(第四天)

目录第四幕、第一场)大厦楼下门口第二场)大门口友情提醒背面试题很枯燥,加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。第四幕、第一场)大厦楼下门口【面试者老王,门卫甲,门卫乙,面试者奥斯卡】门卫甲:天下熙熙皆为利来,天下攘攘皆为利往,像门卫乙和我这样不为名利专心看门,世界上又有多少人呢?

蓝牙资讯|苹果新款AirPods Pro支持Vision Pro无损音频和IP54防水防尘

苹果公司宣称,USB-C能够带来更多灵活性,现在用户可以使用手机的USB-C接口,为AirPodsPro耳机盒充电。虽然苹果没有详细介绍这款耳机,但在今天的新闻稿中依然透露了一些不一样的地方,例如新款AirPodsPro2升级到了IP54级别(原版不防尘,仅IPX4级抗水),可陪伴用户在恶劣的环境中展开冒险。除此之外,

如何用Java+SpringBoot+Vue构建一个靓车汽车销售网站?

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

热文推荐