一文搞清楚Java中常见的IO模型

news2025/1/21 12:19:57

什么是IO

首先,我们要清楚什么是IO,根据冯诺依曼结构,计算机结构分为5部分:运算器、控制器、存储器、输入设备和输出设备。在这里插入图片描述
输入设备和输出设备都属于外设,网卡、硬盘这种既可以属于输入设备也可以属于输出设备。
输入设备向计算机输入数据,输出设备接收计算机输出的数据。
从数据结构的时间来看的话,IO描述了计算机系统与外部设备之间通信的过程。
从应用程序的角度来看:

为了保证操作系的稳定性和安全性,一个进程的地址划分为用户空间和内核空间。
我们平时运行的程序都是在用户空间,只有内核空间才能进行系统态级别的资源有关的操作,比如文件管理,进程通信,内存管理等。也就是我们进行IO操作,一定要有依赖内核空间的能力。并且,用户空间的程序不能直接访问内核空间。
当要执行IO操作的时候,由于没有执行这些操作的权限,只能发起系统调用请求操作系统帮忙完成。
因此,用户进程想要执行IO操作的话,必须通过系统调用来简介访问内核空间。我们平常开发种接触最多的就是磁盘IO(读写文件)网络IO(网络请求和响应)
从应用程序角度来说,我们应用程序对操作系统内核发起IO调用(系统调用),操作系统负责的内核执行具体的IO操作。也就是说我们的应用程序实际上只是发起了IO操作的调用而已,具体的IO执行时由擦欧总系统完成的。
当IO发起待用时,会经历两个步骤:

  • 内核等待IO设备准备好数据
  • 内核将数据从内核空间拷贝到用户空间

下面来介绍一些基本概念:

阻塞非阻塞 指的是在客户端

  • 阻塞: 意味着 客户端提出一个请求以后,在得到回应之前,只能等待
  • 非阻塞: 意味着 客户端提出一个请求以后,在得到回应之前,客户端还可以做其他事情,可以继续提其他请求
    同步异步 指的是服务器端
  • 同步:意味着 服务器接受一个请求后,在返回结果以前不能接受其他请求
  • 异步:意味着 服务器接受一个请求后,尽管还没有返回结果,但是可以继续接受其他请求

举个例子
珂珂领着女朋友牛牛去超市购物,买了很多东西,当他走到收银员那里结账的时候,珂珂(客户端)发出了要求结账的讯息(请求),收银员(服务器)会对他这一要求进行处理。此时有可能产生多种场景

  1. 珂珂傻傻地等着收银员用计算器算出所有物品的总价,并准备付款。(同步阻塞)
  2. 珂珂觉得自己太傻了,于是一边和女朋友牛牛聊天,一边催促收银员快点计算出总价。(同步非阻塞)
  3. 珂珂傻傻地等着收银员的总价结果,收银员却把计算的工作交给计算机之后就去拿袋子帮忙装东西,直到计算机上出现了总价结果,收银员才继续回来完成收款工作。(异步阻塞)
  4. 珂珂觉得自己太傻了,于是一边和女朋友牛牛聊天,一边催出收银员快点计算出总价,而收银员却把计算的工作交给计算机之后就去拿袋子帮忙装东西,直到计算机上出现了总价结果,收银员才继续回来完成收款工作。(异步非阻塞)

此时的同步异步,指的是收银员是否在处理收款这一请求的过程中去做了其他的事情,这也导致了收款的结果是当时告诉了珂珂,还是之后又进行了额外的通知。

而阻塞非阻塞,指的是珂珂是否在等待处理结果的过程中去做了其他的事情。

那么因此,就能得出结论:

同步和异步:关注的是被调用者是否会通过原调用通知调用者。换句话说,处理请求者是通过原调用将结果返回,还是通过其他方式将结果通知调用者。

阻塞和非阻塞:关注的是调用者是否会一直等待被调用者的通知。换句话说,发出请求者是否会在等待过程中去做别的事情。

简单的记忆方法
同步阻塞:A调用B,然后A一直等待B的返回;B执行完后通过原调用接口返回结果。
同步非阻塞:A调用B,然后A执行其他操作,隔段时间看看原调用接口是否有返回结果;B执行完后通过原调用接口返回结果。
异步阻塞:A调用B,然后A一直等待B的回调;B执行完后通过回调、状态等其他方式通知A结果。
异步非阻塞:A调用B,然后A继续做别的,不再搭理B;B执行完后通过回调、状态等其他方式通知A结果。

了解了这些,我们再说Java中有哪些常见的IO模型吧

1. 同步阻塞IO(BIO)

在BIO中,应用程序发起read调用后,会一直阻塞,知道在内核把数据拷贝到用户空间
在这里插入图片描述
我们经常用的IO比如:InputStream 和 OutputStream、Reader 和 Writer、
Socket 编程、File I/O。
BIO 模型的优点是简单易懂,适用于一些并发要求不高的场景。但它也有明显的缺点,主要体现在并发性能上:

  • 阻塞:BIO 的阻塞特性限制了服务器的并发性能,因为每个连接都需要一个线程来处理,当连接数较多时,线程数量也会增多,占用大量系统资源。
  • 扩展性差:由于每个连接都需要一个独立的线程,线程数量受限于操作系统和硬件资源,难以实现高并发。
  • 高开销:线程的创建和销毁以及线程切换都会带来额外的开销,降低了系统的性能。

为了解决 BIO 模型的性能问题,后续发展了 NIO(New I/O)和 AIO(Asynchronous I/O)等模型,它们采用了非阻塞和异步的方式来提高并发性能。因此,在高并发和性能要求较高的应用中,通常会选择使用 NIO 或 AIO 模型来替代传统的 BIO 模型。

2. 同步非阻塞IO(NIO)

同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。
在这里插入图片描述
NIO(New I/O,也称为 Non-blocking I/O)是 Java 中用于进行非阻塞式 I/O 操作的一种编程模型。它在 Java 1.4 版本引入,提供了一种更高效处理 I/O 操作的方式,特别适用于需要处理大量并发连接的网络应用程序。以下是常见的 NIO 组件和类:

  • Channels(通道): NIO 提供了一种新的通道抽象,它是双向的,可以支持读和写操作。常用的通道包括:
  • FileChannel:用于文件操作,支持文件的读写和定位操作。
  • SocketChannel:用于网络套接字的读写。
  • ServerSocketChannel:用于监听传入的 TCP 连接请求。
  • DatagramChannel:用于 UDP 数据报的读写。
  • Buffers(缓冲区): NIO 使用缓冲区来读写数据。常见的缓冲区包括:
  • ByteBuffer:用于读写字节数据。
  • CharBuffer:用于读写字符数据。
  • ShortBuffer、IntBuffer、LongBuffer:用于读写不同数据类型的数据。
  • Selectors(选择器): 选择器是 NIO 的核心组件,用于多路复用 I/O 通道。它可以监视多个通道

NIO 的主要特点是非阻塞和事件驱动,能够更高效地处理大量并发连接,适用于构建高性能的网络服务器和大规模的数据传输应用。与传统的 BIO 模型相比,NIO 更适合需要处理大量连接的场景,如 Web 服务器、聊天服务器等。

3. IO多路复用(AIO)

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
在这里插入图片描述
目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。

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

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

相关文章

深度学习-卷积神经网络-ResNET

文章目录 前言1.resnet2.作者3.精度(TOP-5)4.论文一览5.竞赛排名6.网络退化7.残差8.残差 1.作者 前言 本文来自B站: ResNet深度残差网络 1.resnet 2.作者 3.精度(TOP-5) 4.论文一览 5.竞赛排名 6.网络退化 ResNet解…

拆解常见的6类爆款标题写作技巧!

究竟是先写好文章再拟标题还是先确定标题再写文章呢?很多写稿小白都会有这样的疑惑。 在“人人皆可新媒体”的时代,公众号推文类型琳琅满目,每个人都可以建立自己的公众号,写出自己想写的文章。 但怎样起标题、起什么样的标题&a…

MyCat安装文档

JDK安装 JDK具体安装步骤如下: 1. 上传安装包 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 由于上述在进行文件上传时,选择的上传目录为根目录 /,上传完毕后,我们执行指令 cd / 切换到根目录下,查…

STM32 10个工程篇:1.IAP远程升级(六)

在IAP远程升级的最后一篇博客里,笔者想概括性地梳理总结IAP程序设计中值得注意的问题,诚然市面上或者工作后存在不同版本的IAP下位机和上位机软件,也存在不同定义的报文格式,甚至对于相似的知识点不同教程又有着完全不同的解读&am…

You Know What is C++嵌套类

C嵌套类 一、嵌套类1.嵌套类和访问权限2.作用域3.访问控制 一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类,或者嵌套类型。引入嵌套类,因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现&…

黑马JVM总结(二十七)

(1)synchronized代码块 synchronized代码块的底层原理,它是给一个对象进行一个加锁操作,它是如何保证如果你出现了synchronized代码块中出现了问题,它需要给这个对象有一个正确的解锁操作呢,加锁解锁是成对…

为什么网络安全明明缺口很大,却看起来招聘很少呢?

2023 年我国网络空间安全人才数量缺口超过了 140 万,就业人数却只有 10 多万,缺口高达了 93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&…

10、【Qlib】【主要组件】高频交易嵌套决策执行框架

10、【Qlib】【主要组件】高频交易嵌套决策执行框架 简介简介 日间交易(例如,投资组合管理)和当日交易(例如,订单执行)是量化投资中的两个热门话题,并且通常会分别进行研究。 为了获得日间和当日交易的联合交易绩效,它们必须相互作用,并共同进行回测。为了支持多级的…

7.Tensors For Beginneers - Convector Components

介绍协向量时,曾说过它们有点像 行向量, 行向量确实以某种方式代表了协向量, 这里说明一下: 协向量是不变的; 协向量组件是可变的。 协向量不依赖坐标系,协向量的组件取决于坐标系。 当我们说协向量具有组…

基于SSM的旅游攻略网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

【SpringCloud】微服务技术栈入门3 - Gateway快速上手

目录 GatewayWebFlux网关基本配置过滤器与断言工厂全局过滤器跨域处理 CORS Gateway WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架,用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式,并提供了一种响应式的方…

Java中阻塞队列原理、特点、适用场景

文章目录 阻塞队列对比、总览阻塞队列本质思想主要队列讲解ArrayBlockingQueueLinkedBlockingQueueSynchronousQueueLinkedTransferQueuePriorityBlockingQueueDelayQueueLinkedBlockingDeque 阻塞队列对比、总览 阻塞队列本质思想 阻塞队列都是线程安全的队列. 其最主要的功能…

3分钟基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来,各大公司在大模型方面持续发力,行业大模型也如雨后春笋一般发展迅速,日常工作中比较多的应用场景还是问答模式,作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT,…

python通过socket 搭建极简web服务器

环境:win11、python 3.9.2 背景:python的web框架众多,常见的如django、flask、tornado等,其底层是什么还是有些许的疑问,所以查找相关资料,实现浏览器访问,并返回相关信息 时间:20…

期权定价模型系列【8】:选择者期权(chooser option)定价模型

期权定价模型系列第8篇文章 1.前言 抉择型期权又称为随心所欲期权,是一种与时间相关的期权。这种期权的持有 人有权在到期日之前的某一段时期,决定该选择权为买权或卖权。因此,在决定的时间点,抉择型期权的价值应该为:…

命令解释器-Shell

目录 1. 概述 1.1. 概念 1.2. 分类: 1.3. type 命令 1.4.命令执行原理 2. Linux 中的特殊符号 3. 命令别名 3.1. 查看设置的别名 3.2. 常用的别名 3.3. 删除别名 3.6. 注意(alias永久化): 4. history 命令历史 例&a…

已解决:win的资源管理器右键菜单被折叠无法显示全内容?教你解决

win11在样式上整挺好的,那种圆润感是win10没法比拟的,但是有一个很严重的诟病,就是右键菜单的折叠,这个东西是资源管理器新增的一个功能,如果之前是win右键的重度用户,那么对于这种需要多点一步展开的操作&…

解决报错: require is not defined in ES module scope

用node启动mjs文件报错:require is not defined in ES module scope 现象如下: 原因: 文件后缀是mjs, 被识别为es模块,但是node默认是commonjs格式,不支持也不能识别es模块。 解决办法:把文件后缀从.mjs改…

【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)

本章大致内容目录: 1.认识回调函数 2.排序函数qsort 3.模拟实现qsort 回调函数为C语言重要知识点,以函数指针为主要知识;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。 一、回调函数 1.回调函数定义 回调函数就是一…