NIO三大组件

news/2025/2/11 15:44:10/

文章目录

  • 概述
  • Channel & Buffer
  • Selector
    • 服务器设计历史演化
      • 多线程版设计
      • 线程池版设计
      • selector 版设计

概述

NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件:Channel 、 Buffer 、Selector

Channel & Buffer

channel (中文 管道的意思)有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer(中文 缓冲区的意思),也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。Channel和Buffer是多对多的关系,它们相互协作共同完成数据的传输和处理任务

在这里插入图片描述

常见的 Channel 有

  • FileChannel (文件管道,不支持非阻塞)
  • DatagramChannel
  • SocketChannel (网络管道,支持非阻塞)
  • ServerSocketChannel (服务端网络管道,支持非阻塞)

buffer 则用来缓冲读写数据,常见的 buffer 有

  • ByteBuffer
    • MappedByteBuffer
    • DirectByteBuffer
    • HeapByteBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • CharBuffer

Selector

selector 中文就是选择器的意思,单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途。服务器的设计演化从多线程->线程池selector

服务器设计历史演化

多线程版设计

在这里插入图片描述
在多线程版本下,一个请求到达服务端,服务端开辟一个线程去处理该请求,这种做法在请求量不多的情况下可以接受,但是一旦请求量多了那么问题随之而来,内存占用高、线程上下文切换成本高这些问题会让你的服务器最终崩溃。

线程池版设计

在这里插入图片描述
在线程池版本下,服务器会初始化一个线程池,池内会有一定量的线程,当请求达到服务器时会使用线程池内的线程进行处理,处理完归还给线程池。这种模式下虽然避免了服务器不停地创建线程、销毁线程,但是仍然存在问题:线程仅能处理一个 socket 连接,当处理某个socket时线程就会阻塞等待处理完成才能继续处理其他任务。

selector 版设计

在这里插入图片描述

在selector 模式下,当一个请求到达服务器时,会先和channel进行关联,由selector来管理这些channel什么时候提交给线程处理。这些 channel 工作在非阻塞模式下,有了selector就不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景。调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理。


http://www.ppmy.cn/news/1571189.html

相关文章

jmeter 性能测试Linux 常用的安装

把软件安装包全部都放在/data/soft目录下 一、 Java 环境安装 1. 把JDK的安装包上传到/data/soft/目录下 2. 解压jdk安装包,重命名jdk 3. 配置环境变量 JAVA_HOME [root@MiWiFi-RA72-srv soft]# vim /etc/profile export JAVA_HOME=/data/soft/jdk1.8 export PATH=…

127,【3】 buuctf [NPUCTF2020]ReadlezPHP

进入靶场 吓我一跳 查看源码 点击 审计 <?php// 定义一个名为 HelloPhp 的类&#xff0c;该类可能用于执行与日期格式化相关的操作 class HelloPhp {// 定义一个公共属性 $a&#xff0c;用于存储日期格式化的模板public $a;// 定义一个公共属性 $b&#xff0c;用于存储…

简述C#多线程

目录 一、Thread 类 1、核心功能 2、使用场景 3、示例代码 4、注意事项 二、ThreadPool 类 1、核心功能 2、使用场景 3、示例代码 4、注意事项 三、Task 类 1、核心功能 2、使用场景 3、示例代码 4、注意事项 四、Parallel 类 1、核心功能 2、使用场景 3、示…

【机器学习与数据挖掘实战】案例13:基于BP神经网络模型的家用热水器用户行为分析与事件识别

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支&#xff0c;专注于让计算机系统通过数据学习和改进。它利用统计和计算方法&#xff0c;使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…

基于GA遗传优化的电动汽车光储充电站容量配置算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的电动汽车光储充电站容量配置算法matlab仿真。通过运行基于 GA 的光储充电站容量配置算法&#xff0c;得到了最优的容量配置方案。与传统的容量配…

IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目

文章目录 问题背景办法1、设置git代理&#xff1b;2、再次克隆项目&#xff1b;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外&#xff0c;很多时候我们在使用idea克隆开源项目的时候&#xff0c;没办法检出&#xff0c;提示 连接重置。 办法 1、设置git代…

【故障处理】ORA-19849 ORA-19612 0RA-17627 ORA-03114

【故障处理】ADG duplicate 异常中断ORA-19849 ORA-19612 0RA-17627 ORA-03114 Corrupt block 84629 found during reading backup piece 一、概述二、报错信息三、报错原因四、解决方法五、其他类似报错5.1 报错信息 一、概述 部署adg执行duplicate异常中断&#xff0c;RMAN过…

echarts 鼠标移入柱状图展示手指,移入label 展示箭头

问题描述&#xff1a; 目前官方没有提供分类展示移入样式设置&#xff0c;所以得主动加入移入事件来分别做设置&#xff0c; 关键事件&#xff1a; _this.chartInstancenf.getZr().on(mousemove, (params) > {}&#xff09; 鼠标移入柱状图是有name的&#xff0c;他的nam…