java IO模型

2023-11-07

目录

IO模型:BIO NIO AIO io多路复用模型

BIO 

NIO

引出netty 


IO模型:BIO NIO AIO io多路复用模型

BIO,NIO,AIO(Java中的NIO就是多路复用,linux中的NIO是指普通的非阻塞IO)

(AIO异步 AIO是每个请求从一开始就分配一个线程,实现了真正的异步处理。但是这也会带来一个问题,线程池中线程的数量不是无限的,如果每个请求从一开始就分配线程进行处理,很快就会用完线程。故netty用的不是Aio而是Nio ,netty的异步指的是 多线程处理结果) 

BIO 

阻塞:在accept和read方法会发生阻塞,(阻塞的意思是当前线程 没有连接建立或者没有读到数据,就不会往下执行,阻塞等待,不会占用cpu,但线程相当于闲置。非阻塞即使没有连接,没有读到数据,也会往下执行,只不过accept等于null读到的值为0.)单线程版的阻塞,如果没有新的accept就不会read,只有有了新连接才会往下执行read,这样单线程显得力不从心,太笨重了,可以引入多线程技术,如果连接数过多,会oom,并且线程过大,反而因为线程上下文切换,导致性能降低。即使引进线程池版,如果多个连接建立了 但是inactive,也会阻塞线程。不适合长连接。适合短链接。

如果BIO使用单线程接受连接,则会阻塞其他连接,效率较低。
如果使用多线程虽然减弱了单线程带来的影响,但当有大并发进来时,会导致服务器线程太多,压力太大而崩溃。
就算使用线程池,也只能同时允许有限个数的线程进行连接,如果并发量远大于线程池设置的数量,还是与单线程无异。

NIO

非阻塞:即使没有连接,没有读到数据,也会往下执行,只不过accept等于null读到的值为0.缺点:cpu利用率过高,会发生空轮转,即没有新连接也会向下执行,cpu会100%。白白浪费cpu,线程复制过程中,线程实际上还是阻塞的(aio改进的地方)

由此引进Nio 基于io多路复用的单线程事件监听机制,非阻塞模式下

基于事件驱动(基于io多路复用)的非阻塞,即只会有连接建立的时候才去访问,只要有数据可读的时候才去读。

selector.select()也是阻塞的,没有事件就会阻塞,有事件才会向下执行运行。(无事件阻塞,有事件非阻塞)。selector什么实话2不阻塞:1,channel可写的时候,2,客户端发起连接的时候,会触发accept(),客户端发送数据时,客户端关闭时(正常或异常)会触发read事件,另外如果发送的数据大于buffer缓冲区的大小 ,会多次触发read事件。3,再linux下,nio bug发生的时候。(即使没有数据,也会向下执行)selector.wakeup() selector.close() selector所在线程interrupt。

以上nio是基于单线程,但是现在cpu都是多核的,没有充分利用cpu。所以你也可以用多线程。

nio三大组件:channel selector buffer

  1. channel(和 stream都是全双工,读写可以同时进行)
  2. selector:创建selector :Selector selector=Selector.open();建立selector和channel之间的关系并得到selectionKeys  SelectionKeys ssckeys= ssc.register(selector,0,null); ssckey关心的是accept事件 :ssckey.interestOps(SelectKeys.OP_ACCEPT)  然后select()方法 监听事件的发生。
  3. buffer

引出netty 

  Netty是异步 基于事件驱动的网络应用框架(此处的异步是指 多线程去回调read,write,accept结果,不会阻塞住。io模型还是基于多路复用的,通过selector监听是否有可读可写 可连接状态,如果没有阻塞住 不向下执行,如果有的话 就去执行监听到的事件。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java IO模型 的相关文章

随机推荐

  • java读取多个代码文件到txt文件

    读取目录下多个代码文件 并把内容写入到一个新的txt或者word package javawhl file import java io BufferedReader import java io BufferedWriter import
  • 跟这台计算机连接的一个USB设备运行不正常,Windows无法识别

    问题描述 用集线器 hub 连接电脑 android设备连接接线器 今天早上打开电脑和项目突然爆出错误 跟这台计算机连接的一个USB设备运行不正常 Windows无法识别 该设备已被禁用 原因是 设备的固件没有提供必需的资源 代码 29 重
  • 深度学习训练营之鸟类识别

    深度学习训练营之鸟类识别 原文链接 环境介绍 前置工作 设置GPU 导入数据并进行查找 数据处理 可视化数据 配置数据集 残差网络的介绍 构建残差网络 模型训练 开始编译 结果可视化 训练样本和测试样本 预测 原文链接 本文为 365天深度
  • 区间交叠问题

    区间交叠问题 问题描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖住所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y
  • 利用response对象实现下载文件功能

    HttpServletResponse对象继承了ServletResponse接口 下面利用response对象实现下载的功能 单个文件的下载 package com dongmu servlet import javax servlet
  • 使用slice和concat对数组的深拷贝和浅拷贝

    一 数组浅拷贝 在使用JavaScript对数组进行操作的时候 我们经常需要将数组进行备份 如下代码 如果只是简单才用赋值的方法 那么我们只要更改其中的任何一个 然后其他的也会跟着改变 这就导致了问题的发生 var arr1 red yel
  • FastAdmin的一个小BUG,无法正常识别驼峰命名法的控制器名

    FastAdmin中内置了权限管理模块 在应用的过程中 控制器名经常会是两个单词 比如NotifyMessage 这是控制器名 在设置权限时 我们需要写成 notify message 可是这样设置后 会提示没有权限 而写成notifyme
  • PTA题选

    判断题 任何表达式语句都是表达式加分号组成的 True C语言语句都有结束符 指向结构体变量的指针可以作函数参数 实现传址调用 True 结构体成员的类型必须是基本数据类型 False if a 5 是允许的 True a 5 永远为真 假
  • 关于自定义标签报空指针异常:"at org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:97) "...

    tomcat8对相对路径路径的不是很好 可以在web xml文件中设置好tld的路径 然后JSP中直接 web xml文件添加以下配置
  • java面试题个人总结宝典1-java基础篇

    前言 前段时间换工作 用了5天时间整理了一大堆小白面试题 注 本人19年毕业 都是一些个人总结 希望能帮到有需要的人 如果你和我一样也是正准备踏入社会 或者工作还不到2年的 亦或是最近在找 java工程师 之类工作的 那我觉得这个系列非常适
  • Cpp学习——string模拟实现

    目录 一 string的成员变量 二 string的各项功能函数 1 构造函数 2 析构函数 3 扩容函数 4 插入与删除数据的函数 5 运算符重载 6 打印显示函数 7 拷贝构造 8 find函数 一 string的成员变量 在模拟实现s
  • 等保2.0 安全计算环境 ——Windows服务器(三级系统)

    1 身份鉴别 A 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度并要求定期更换 1 核查用户是否需要输入用户名和密码才能登录 2 核查Windows默认用户名是否具有唯一性 3 选择 控制面板 gt 管理工具
  • vscode中设置webpack js alias提示

    vscode 中设置 webpack alias 路径提示 1 根目录下创建 jsconfig json 文件 ts 中 把 文件修改为 tsconfig json 即可 2 添加如下配置 参考着 修改下配置即可 compilerOptio
  • Manjaro/Arch 软件配置安装

    记录一下自己配置 M a n j a r o A
  • 【论文阅读 07】Anomaly region detection and localization in metal surface inspection

    比较老的一篇论文 金属表面检测中的异常区域检测与定位 总结 提出了一个找模板图的方法 使用SIFT做特征提取 姿态估计看差异有哪些 Hough聚类做描述符筛选 仿射变换可视化匹配图之间的关系 提出一个搜索方法 降低图像分辨率 设定对比度和匹
  • kafka3.1集群部署

    kafka依赖zookeeper负责broker的注册 所以需要提前安装好zookeeper 1 安装zookeeper集群 https blog csdn net xiaohanshasha article details 1240083
  • k8s跨主机网络方案之Flannel

    什么是overlay network Overlay 技术是在现有的物理网络之上构建一个虚拟网络 上层应用只与虚拟网络相关 Overlay 在网络技术领域 指的是一种网络架构上叠加的虚拟化技术模式 其大体框架是对基础网络不进行大规模修改的条
  • Python知识点整理,图文结合近三万字(史上最全)

    Python知识点 一 Python精华知识点手册 完整版 下载 Python知识点 二 Python知识点 三 Python对csv的处理 edcoding utf 8 import pandas as pd import csv df
  • [C语言]计算某字符出现次数

    目录 题目 代码 题目 代码 include
  • java IO模型

    目录 IO模型 BIO NIO AIO io多路复用模型 BIO NIO 引出netty IO模型 BIO NIO AIO io多路复用模型 BIO NIO AIO Java中的NIO就是多路复用 linux中的NIO是指普通的非阻塞IO