【IO面试题 三】、说说NIO的实现原理

news2024/11/13 7:53:48

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

面试官:说说NIO的实现原理

参考答案:

Java的NIO主要由三个核心部分组成:Channel、Buffer、Selector。

基本上,所有的IO在NIO中都从一个Channel开始,数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中。Channel有好几种类型,其中比较常用的有FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel等,这些通道涵盖了UDP和TCP网络IO以及文件IO。

Buffer本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。Java NIO里关键的Buffer实现有CharBuffer、ByteBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。这些Buffer覆盖了你能通过IO发送的基本数据类型,即byte、short、int、long、float、double、char。

Buffer对象包含三个重要的属性,分别是capacity、position、limit,其中position和limit的含义取决于Buffer处在读模式还是写模式。但不管Buffer处在什么模式,capacity的含义总是一样的。

  • capacity:作为一个内存块,Buffer有个固定的最大值,就是capacity。Buffer只能写capacity个数据,一旦Buffer满了,需要将其清空才能继续写数据往里写数据。

  • position:当写数据到Buffer中时,position表示当前的位置。初始的position值为0。当一个数据写到Buffer后, position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity–1。当读取数据时,也是从某个特定位置读。当将Buffer从写模式切换到读模式,position会被重置为0。当从Buffer的position处读取数据时,position向前移动到下一个可读的位置。

  • limit:在写模式下,Buffer的limit表示最多能往Buffer里写多少数据,此时limit等于capacity。当切换Buffer到读模式时, limit表示你最多能读到多少数据,此时limit会被设置成写模式下的position值。

三个属性之间的关系,如下图所示:
在这里插入图片描述
Selector允许单线程处理多个 Channel,如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件例如有新连接进来,数据接收等。

这是在一个单线程中使用一个Selector处理3个Channel的图示:
在这里插入图片描述
扩展阅读

Java NIO根据操作系统不同, 针对NIO中的Selector有不同的实现:

  • macosx:KQueueSelectorProvider

  • solaris:DevPollSelectorProvider

  • Linux:EPollSelectorProvider (Linux kernels >= 2.6)或PollSelectorProvider

  • windows:WindowsSelectorProvider

所以不需要特别指定,Oracle JDK会自动选择合适的Selector。如果想设置特定的Selector,可以设置属性,例如: -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider。

JDK在Linux已经默认使用epoll方式,但是JDK的epoll采用的是水平触发,所以Netty自4.0.16起, Netty为Linux通过JNI的方式提供了native socket transport。Netty重新实现了epoll机制。

  • 1、采用边缘触发方式;

  • 2、netty epoll transport暴露了更多的nio没有的配置参数,如 TCP_CORK, SO_REUSEADDR等等;

  • 3、C代码,更少GC,更少synchronized。

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

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

相关文章

eclipse安装教程(2021版)

第一步:下载JDK (下载地址) Java SE - Downloads 第二步 根据自己电脑的系统,选择相应的版本x64代表64位,x86代表32位。点击相应的JDK进行下载 点击之后会出现一个对话框 同意之后下载。(记住下载到哪,打…

二叉树:什么样的二叉树适合用数组来存储?

文章来源于极客时间前google工程师−王争专栏。 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 问题&#xff1…

【Javascript】弹出框

目录 警告框 确认框 提示框 警告框 alert(你好); 确认框 var isConfirm confirm(请确认) console.log( isConfirm); 提示框

基于非侵入式负荷检测与分解的电力数据挖掘

基于非侵入式负荷检测与分解的电力数据挖掘 在这里插入图片描述 **摘要:本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况,分析各电力设备的实际用电量,进而为电力公司制定电能能源策略提供一定的参…

电脑报错由于找不到vcruntime140.dll文件怎么修复

VCruntime140.dll是一个重要的动态链接库文件,它对于许多应用程序的运行起着关键作用。如果计算机中丢失了这个文件,可能会导致一些程序无法正常启动或运行,从而影响到用户的正常使用。在本文中,我们将详细介绍vcruntime140.dll文…

Cross Site Scripting (XSS)

攻击者会给网站发送可疑的脚本,可以获取浏览器保存的网站cookie, session tokens, 或者其他敏感的信息,甚至可以重写HTML页面的内容。 背景 XSS漏洞有不同类型,最开始发现的是存储型XSS和反射型XSS,2005,Am…

【JVM】字节码文件的组成部分

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 JVM 一、字节码文件的组成部分1.1 iconst_0…

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具,一般手动操作即可,但有时候也要集成到系统中,需要程控。这时候先要下载厂家提供的例子,了解LabVIEW的demo。根据不用的示波器型号,选择和计…

在职场上有多少人输在了不会用Python数据分析

在职场上有多少人输在了不会用Python数据分析 在职场上有多少人输在了不会用Python数据分析引言方向一:学了Python能做什么?方向二:Python的应用领域1. Web开发:2. 自动化和脚本编写:3. 数据科学和分析:4. …

锐捷RG-UAC账号密码信息泄露

第一种方法: 构造如下Payloads https://xxxxx/get_dkey.php?useradmin访问payload成功后,可以看到受影响系统的超级管理员权限账号、访客权限账号、审计权限账号的账户名和 MD5 加密的密码值,如下图所示: 下面可以使用上一步查…

【强化学习】10 —— DQN算法

文章目录 深度强化学习价值和策略近似RL与DL结合产生的问题深度强化学习的分类 Q-learning回顾深度Q网络(DQN)经验回放优先经验回放 目标网络算法流程 代码实践CartPole环境代码结果 参考 深度强化学习 价值和策略近似 我们可以利用深度神经网络建立这些…

缺少d3dx9_43.dll怎么解决 win系统如何运行dll文件?

大家好!今天我来给大家分享一下关于d3dx9_43.dll缺失的4种详细解决方案。 首先,让我们了解一下d3dx9_43.dll是什么文件。其实,d3dx9_43.dll是DirectX的一个组件,它主要负责处理游戏中的一些特效和动画效果。如果这个文件丢失了&a…

MacOS系统电脑怎么彻底清理系统垃圾注册表App Cleaner可以深度清理吗

App Cleaner & Uninstaller 是一款适用于 Mac 操作系统的软件应用程序,允许用户轻松卸载不需要的应用程序、删除剩余文件和文件夹以及管理启动项。该应用程序会分析与您要删除的应用程序关联的文件,并帮助识别其所有组件,以便您可以一次将…

C++学习day--23 枚举、类型定义、头文件

1、枚举 1.1 枚举的概念 枚举是 C/C 语言中的一种基本数据类型, 它可以用于声明一组常数 。当一个变量有几个固 定的可能取值时,可以将这个变量定义为枚举类型。 比如,你可以用一个枚举类型的变量来表示季节,因为季节只有 4 …

C++之左值、右值、std::forward、std::move总结(二百五十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

033-第三代软件开发-固定区域截图

第三代软件开发-固定区域截图 文章目录 第三代软件开发-固定区域截图项目介绍固定区域截图QWidget 版本QML 版本 自由截图自由截图二 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QM…

粤嵌实训医疗项目--day03(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客 粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能(文件上传) 三、用户模块-注册实现…

基于stm32的ADC读取烟雾报警器的数值

本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一:基于LaTeX环境方案二:基于KaTeX(推荐) 方案三:基于Matplotlib写在最后 引言 近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验,避免商家总是要在众多的配送公司中选择想要,小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处,指定需要设置的首选…