当前位置: 首页 > news >正文

JAVA IO模型

我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。也就是说,我们的应用程序实际上只是发起了 IO 操作的调用而已,具体 IO 的执行是由操作系统的内核来完成的。
当应用程序发起 I/O 调用后,会经历两个步骤:

  1. 内核等待 I/O 设备准备好数据
  2. 内核将数据从内核空间拷贝到用户空间。

首先,解释一下这里的阻塞与非阻塞:

阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间,执行用户的操作。阻塞指的是用户空间程序的执行状态,用户空间程序需等到IO操作彻底完成。传统的IO模型都是同步阻塞IO。在java中,默认创建的socket都是阻塞的。

其次,解释一下同步与异步:

同步IO,是一种用户空间与内核空间的调用发起方式。同步IO是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。异步IO则反过来,是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。

同步阻塞 I/O

同步阻塞 I/O 是最简单的一种 I/O 模型。在这种模型下,I/O 操作会阻塞调用线程,直到操作完成。
应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。
在这里插入图片描述

特点:

  • 阻塞: 线程在发起 I/O 操作时会被阻塞,直到 I/O 操作完成(即数据被读入或写入)。
  • 简单易用: 编程模型简单,容易理解和实现。
  • 效率问题: 当有多个 I/O 操作时,线程可能会因为等待 I/O 完成而浪费时间,从而导致性能瓶颈。

举例:BIO (Blocking I/O)

同步非阻塞 I/O

同步非阻塞 I/O 允许线程在发起 I/O 操作时立即返回,线程可以在 I/O 操作未完成时继续执行其他任务。
在这里插入图片描述

特点:

  • 非阻塞: I/O 操作不会阻塞线程,线程可以继续执行其他任务。
  • 轮询: 需要使用轮询机制(例如 select())来检查 I/O 操作是否完成,从而确定是否可以读取数据。
  • 复杂性: 编程模型比阻塞 I/O 复杂,需要显式地处理 I/O 操作的完成状态。
    举例:NIO (Non-blocking/New I/O)

过程:同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。

比较:相比于同步阻塞 IO 模型,同步非阻塞 IO 模型确实有了很大改进。通过轮询操作,避免了一直阻塞。

问题:应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。

这个时候,I/O 多路复用模型 就上场了。

I/O 多路复用

I/O 多路复用 允许一个线程同时管理多个 I/O 操作。通过使用系统提供的多路复用机制,线程可以等待多个 I/O 操作的完成,而无需为每个操作创建一个独立的线程。
在这里插入图片描述

特点:

  • 高效: 能够有效地管理多个 I/O 操作,避免了为每个连接创建线程的开销。
  • 系统调用: 使用系统调用(如 select()、poll()、epoll())来检查多个通道的状态。

IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。

目前支持 IO 多路复用的系统调用,有 select,epoll 等等。select 系统调用,目前几乎在所有的操作系统上都有支持。

  • select 调用:内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。
  • epoll 调用:linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。

在这里插入图片描述

信号驱动 I/O

信号驱动 I/O 是一种基于信号的 I/O 模型,通过信号通知应用程序某个 I/O 操作已准备好。应用程序可以在接收到信号时执行相应的 I/O 操作。

特点:

  • 信号通知: 使用信号(如 SIGIO)来通知应用程序 I/O 操作的完成或准备好。
  • 操作系统依赖: 通常依赖于操作系统的特定实现,因此在不同平台上的可移植性较差。

异步 I/O

异步 I/O 允许应用程序发起 I/O 操作后,立即继续执行其他任务。当 I/O 操作完成时,系统会通知应用程序,并通常会调用一个回调函数来处理结果。

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

举例:AIO (Asynchronous I/O)
在这里插入图片描述

特点:

  • 非阻塞: 线程可以发起 I/O 操作后立即返回,异步 I/O 操作会在后台完成。
  • 回调机制: 当 I/O 操作完成时,系统会调用注册的回调函数。
  • 复杂性: 需要处理异步事件和回调函数,编程模型较为复杂。

总结

  • 同步阻塞 I/O: 简单易用,但效率较低,容易造成线程阻塞。
  • 同步非阻塞 I/O: 允许线程在 I/O 操作期间执行其他任务,但需要显式轮询。
  • I/O 多路复用: 提高了对多个 I/O 操作的处理能力,适合高并发场景。
  • 信号驱动 I/O: 使用信号通知 I/O 状态变化,但在不同操作系统上可移植性较差。
  • 异步 I/O: 非常高效,通过回调机制处理 I/O 操作,适合处理大量并发任务。

参考:
程序员应该这样理解IO
如何完成一次IO
IO模型知多少
10 分钟看懂, Java NIO 底层原理

相关文章:

JAVA IO模型

我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负…...

《C/C++实战专栏》介绍

🚀 前言 本文是《C/C实战专栏》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内容&…...

前端跨域2

前端跨域2 前端跨域解决方案&#xff08;11种方案&#xff09; 1.JSONP跨域解决方案的底层原理 script、img、link、iframe...<script src"https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>// 这个就是因为script标签没有跨域限制&#xff0…...

electron仿微信,新建贴合窗口

说明 在写electron项目时&#xff0c;只有一个主窗口不足以满足需求&#xff0c;我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样&#xff0c;全贴合在一起&#xff0c;看起来像一个整体呢&#xff1a; 分析 这个窗口有点像element ui中的抽屉(drawe…...

uniapp微信小程序 分享功能

uniapp https://zh.uniapp.dcloud.io/api/plugins/share.html#onshareappmessage export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分享按钮console.log(res.target)}return {title: 自定义分享标题,path: /pages/test/test?id123}} }需要再真机…...

Java实现数据库数据到Excel的高效导出

在数据处理和分析工作中&#xff0c;经常需要将数据库中的数据导出到Excel文件中。本文将提供一个Java实现的示例&#xff0c;展示如何边从数据库读取数据&#xff0c;边将其写入Excel文件&#xff0c;同时注重内存效率。 环境配置&#xff1a; Java 1.8 或更高版本MySQL 5.7…...

python之matplotlib (8 极坐标)-圆与心

极坐标 极坐标图像的绘制类似于三维图像的绘制&#xff0c;只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…...

Kubernetes Pod调度基础

在传统架构中&#xff0c;我们总在考虑或者面临一个问题&#xff0c;我们的应用需要部署在哪里&#xff0c;我们的应用下载在哪里运行着?有一个服务不可访问了&#xff0c;去哪里排査?诸如此类的问题总是会出现在工作中。 但是在使用 Kubernetes 部署应用后&#xff…...

80页WORD方案深入了解大数据治理+大数据资产管理+数据运营

文档是一份80页可编辑的企业大数据智能管理与治理平台建设项目技术方案标书文档&#xff0c;涵盖了从项目需求分析、技术方案、建设方案、服务方案到类似案例介绍等多个方面的内容。 1. 项目需求分析 项目建设目标&#xff1a;旨在实现数据的可视化&#xff0c;确保决策者、行…...

OCC安装、VS2019编译运行(新手教程)

OCC安装、VS2019编译运行(新手教程) 简介1、OpenCasCade的下载和安装官网下载安装2、OpenCasCade的运行和编译(VS2019)修改配置文件环境变量配置3、验证代码项目配置运行cpp文件简介 作为一个刚接触OCC的程序员,可能会不知所措,无从下手,甚至在OCC的安装使用都困难重重…...

Mojo 实现排序功能

sort排序 实现排序功能。 您可以从包中导入这些 API。例如&#xff1a;algorithm from algorithm.sort import sortpartition partition[type: AnyRegType, cmp_fn: fn[AnyRegType]($0, $0, /) capturing -> Bool](buff: Pointer[*"type", 0], k: Int, size: …...

信息学奥赛一本通编程启蒙题解(3031~3035)

前言 Hello大家好我是文宇 正文 3031 #include<bits/stdc.h> using namespace std; double n,m,x; int main(){cin>>n>>m;xn-m*0.8;cout<<fixed<<setprecision(2)<<x;return 0; } 3032 #include<bits/stdc.h> using namespace…...

字符函数内存函数———C语言

字符分类函数 头文件&#xff1a; ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符&#xff08;空格&#xff0c;换页、换行、回车、制表符或垂直制表符&#xff09;isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…...

c语言跨文件传输数据

在 C 语言中&#xff0c;可以通过以下几种方式获取其他 C 文件中定义的变量&#xff1a; 一、使用 extern 关键字 在需要获取变量的文件中&#xff0c;使用extern关键字声明该变量。 例如&#xff0c;如果在other.c文件中有一个全局变量int globalVar;&#xff0c;在当前文件中…...

企业文件防泄密怎么做?10款透明加密软件排行榜

在信息时代&#xff0c;企业的核心竞争力往往体现在其拥有的知识和信息上&#xff0c;而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题&#xff0c;透明加密技术因其无缝集成和高效保护的特性&#xff0c;成为企业防泄密的首选方案。2024年…...

AI编程工具的力量:以AWS Toolkit与百度Comate为例,加速程序员开发效率

在当今的数字化转型浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术不仅重塑了众多行业&#xff0c;也为软件开发领域带来了革命性的变化。AI编程工具&#xff0c;凭借其智能化的特性&#xff0c;正在成为程序员提高开发效率、优化代码质量和加速产品迭代的重要助力…...

smallpdf: 免费高效的PDF水印添加工具

引言 在数字文档管理和分享的过程中&#xff0c;保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式&#xff0c;经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具&#xff0c;它能够轻松地为PDF文件添…...

java整合modbusRTU与modbusTCP

理解 Modbus TCP 报文格式,Modbus TCP 报文格式如下: | Transaction ID (2 bytes) | Protocol ID (2 bytes) | Length (2 bytes) | Unit ID (1 byte) | Function Code (1 byte) | Data (N bytes) |Transaction ID:标识事务的唯一标识符,确保正确的 Transaction ID:每个请求…...

四、Docker使用

1. 快速入门 1.1. Docker背景介绍 Docker是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它能够在Windows&#xff0c;macOS&#xff0c;Linux计算机上运行&#xff0c;并将某一应用程序及其依赖项打包至一个容器中&#xff0c;这些容器可以在任何支持Docker的环…...

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…...

告别裸机UI!用LVGL 8.3给你的STM32项目做个漂亮界面(基于HAL库和SPI屏)

从零打造STM32智能界面&#xff1a;LVGL 8.3实战指南 在嵌入式开发领域&#xff0c;用户界面往往是最容易被忽视却最能直接影响用户体验的环节。想象一下&#xff0c;当你精心设计的智能家居控制面板或工业仪表&#xff0c;因为简陋的字符界面而显得廉价时&#xff0c;那种挫败…...

H3C F1070防火墙console密码恢复实战指南

1. 当console密码成为拦路虎时 刚接手公司网络设备那会儿&#xff0c;我就被H3C F1070防火墙来了个下马威。那天机房搬迁后需要调试设备&#xff0c;结果发现前任管理员留下的console密码早已失效。这种场景就像你拿着钥匙回老家&#xff0c;却发现锁芯被换了一样尴尬。作为网络…...

记录模式到底要不要在Spring Boot中落地?阿里、蚂蚁内部技术委员会最新评估报告曝光,87%团队已启动灰度迁移

第一章&#xff1a;记录模式在Spring Boot生态中的战略定位与演进脉络 记录模式&#xff08;Recording Mode&#xff09;并非Spring Boot官方术语&#xff0c;而是社区对一类以“可观测性前置”为核心理念的设计范式所形成的共识性称谓——它强调在应用生命周期早期即注入结构化…...

DM数据库迁移实战:dimp与dexp版本兼容性问题解析与解决方案

1. 当DM数据库迁移遇上版本兼容性问题 最近在帮客户做DM数据库迁移时&#xff0c;遇到了一个典型问题&#xff1a;用高版本dexp导出的数据文件&#xff0c;无法用低版本dimp导入。这就像用最新版Word写的文档&#xff0c;用老版本打不开一样让人头疼。具体表现是执行导入命令时…...

Anything to RealCharacters 2.5D转真人引擎:AI艺术展数字作品写实化呈现

Anything to RealCharacters 2.5D转真人引擎&#xff1a;AI艺术展数字作品写实化呈现 你是否曾想过&#xff0c;将那些精美的二次元插画、可爱的卡通头像&#xff0c;或者充满想象力的2.5D游戏角色&#xff0c;一键变成栩栩如生的真人照片&#xff1f;这听起来像是电影里的特效…...

CLIP-GmP-ViT-L-14模型部署保姆级教程:从零开始的Docker环境配置

CLIP-GmP-ViT-L-14模型部署保姆级教程&#xff1a;从零开始的Docker环境配置 你是不是也对那些能看懂图片的AI模型感到好奇&#xff1f;比如&#xff0c;你上传一张猫的照片&#xff0c;AI不仅能认出是猫&#xff0c;还能告诉你这是橘猫&#xff0c;正在晒太阳。CLIP-GmP-ViT-…...

圣女司幼幽-造相Z-Turbo多模态生成:从文本到视频脚本的连贯创作

圣女司幼幽-造相Z-Turbo多模态生成&#xff1a;从文本到视频脚本的连贯创作 最近在尝试一些新的内容创作工具&#xff0c;发现了一个挺有意思的现象&#xff1a;很多工具要么只能做图&#xff0c;要么只能写文案&#xff0c;想把它们串起来做个完整的视频&#xff0c;中间总得…...

别再死记硬背了!用Halcon的vector_angle_to_rigid算子搞定视觉定位,附完整代码

视觉定位实战&#xff1a;用Halcon的vector_angle_to_rigid算子避开几何变换的三大误区 在工业视觉项目中&#xff0c;刚体变换是坐标转换的核心技术&#xff0c;但许多工程师在使用Halcon的vector_angle_to_rigid算子时&#xff0c;常陷入三个致命误区&#xff1a;误认为旋转…...

Acode:重新定义Android移动代码编辑体验

Acode&#xff1a;重新定义Android移动代码编辑体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动开发日益普及的今天&#xff0c;拥有一款高效的移动代码编辑器成为开发者的迫切需…...

ESP8266高速移位寄存器驱动库:3.8μs级GPIO直控

1. FastEsp8266ShiftRegister 库概述FastEsp8266ShiftRegister 是一款专为 ESP8266 微控制器深度优化的高速移位寄存器驱动库。其核心设计目标是突破传统软件模拟 SPI 或标准 GPIO 操作在 ESP8266 上的性能瓶颈&#xff0c;实现接近硬件 SPI 时序精度、但具备更高灵活性的并行/…...