IO

IO的核心就是数据传输,也就是程序与外部设备之间进行传输,通过IO的核心可以分为,

文件IO和网络IO

文件IO交互的对象就是本地存储设备,比方说读写本地文件。

网络IO交互的对象就是网络设备,核心的应用场景就是网络通信。

按照操作方式来进行划分:同步IO和异步IO

同步IO核心逻辑是指调用者发起IO请求之后必须等待IO操作完全完成,才能继续执行,缺点就是效率低,应用场景大部分简单业务。

异步IO调用者发起IO请求后,无需等待,直接返回,IO完成后内核通知告知调用者和。缺点就是逻辑复杂,需要进行通知处理,应用在高并发场景。

按照内核是否拷贝数据分:阻塞IO和非阻塞IO。

阻塞IO核心逻辑是发起请求之后内核若数据未准备好,会让调用者阻塞,直到数据准备好并完成拷贝,才会叫醒调用者。

非阻塞IO:核心逻辑是调用者发起请求后,内核数据未准备好,会立即返回未就绪状态,调用者需要通过轮询进行反复的查找,确认数据是否准备好

经典IO模型

1. BIO - Blocking I/O (阻塞 I/O)

  • 为什么叫“BIO”?
    因为它代表 Blocking I/O。在 Java 1.4 之前,只有一套原始的 I/O API(java.io 包,如 InputStreamOutputStreamServerSocketSocket)。这套 API 的核心特征就是 阻塞

  • “阻塞”体现在哪里?
    当线程调用 read() 或 accept() 等方法时,线程会被挂起,直到数据准备好或连接建立成功。在此期间,这个线程什么也干不了,就像被“阻塞”住了一样。

  • 设计模式
    通常采用 “一个连接一个线程” 的模型。当并发连接数很高时,需要创建大量线程,而线程上下文切换的开销巨大,会耗尽系统资源。

结论:BIO 是以其最核心的特征——Blocking(阻塞)——来命名的。


2. NIO - New I/O / Non-blocking I/O (新的 I/O / 非阻塞 I/O)

  • 为什么叫“NIO”?
    这个名字有双重含义

    1. 字面意思:New I/O。因为在 Java 1.4 中,它是一套全新的 I/O API(java.nio 包),旨在解决 BIO 的性能瓶颈。

    2. 核心特性:Non-blocking I/O。这是这套新 API 最引人注目的特性之一。它提供了非阻塞的工作模式。

  • “非阻塞”体现在哪里?
    线程可以向通道(Channel)发起一个读请求,如果当时没有数据可用,线程不会被挂起,而是立刻得到一个返回结果(比如返回 0),然后这个线程可以马上去处理其他通道的请求。

  • 核心机制
    它的非阻塞能力是建立在 I/O 多路复用 机制之上的(通过 Selector 实现)。一个线程可以轮询多个通道(Channel),看哪些已经就绪,然后只对那些就绪的通道进行实际的 I/O 操作。这才是它能够用少量线程处理大量连接的关键。

结论:NIO 的名字既代表了它是“新”的 API,也强调了其“非阻塞”的核心特性。


3. AIO - Asynchronous I/O (异步 I/O)

  • 为什么叫“AIO”?
    因为它代表 Asynchronous I/O。这是在 Java 7 中引入的,更加强大和彻底的异步 I/O 模型。

  • “异步”体现在哪里?
    它与“非阻塞”有本质区别:

    • NIO (Non-blocking): 是 同步的。你需要不断地主动去问(轮询)数据好了没有,然后自己去拷贝数据。

    • AIO (Asynchronous): 是 真正异步的。你只需要发起一个 I/O 操作(如 read),并提供一个回调函数。当内核完成所有工作(包括数据准备和从内核空间拷贝到用户空间)后,会主动通知你,并调用你提供的回调函数。

    整个过程,应用程序线程完全不需要参与,可以继续执行其他逻辑。

  • 实现
    在 Java 中,AIO 的相关类在 java.nio.channels 包下,主要以 AsynchronousSocketChannelAsynchronousServerSocketChannel 和 CompletionHandler 为核心。

结论:AIO 的名字准确地描述了其“异步”的本质特征,即“你叫我,我来做,做好了回调告诉你”。

缩写全称中文核心特征模型比喻
BIOBlocking I/O阻塞式 I/O调用会阻塞线程同步阻塞同步排队:在餐厅点餐后,必须站在柜台前傻等,直到餐做好。
NIONew I/O Non-blocking I/O新的 I/O 非阻塞 I/O调用不会阻塞线程同步非阻塞 (I/O多路复用)异步排队:点餐后拿个号,你可以去玩手机,但需要不时抬头看屏幕是否叫到你的号,然后自己去取
AIOAsynchronous I/O异步 I/O由系统完成后回调异步非阻塞外卖手机下单后就不用管了,外卖小哥会直接送到你手上,并通知你。

“BIO 和 NIO 的命名主要源于 Java API 的演进。BIO 代表 Blocking I/O,强调了其阻塞的特性。NIO 既是 New I/O(一套新的 API),也代表了 Non-blocking I/O(其核心特性之一)。而 AIO 则明确代表了 Asynchronous I/O,即异步 I/O 模型,这是从它们最根本的行为特征来命名的。”

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10分钟了解什么是多模态大模型

10分钟了解什么是多模态大模型(MM-LLMs) 1. 什么是多模态 Multimodality 多模态(Multimodality)是指集成和处理两种或两种以上不同类型的信息或数据的方法和技术。在机器学习和人工智能领域,多模态涉及的数据类型通常…

通过DSL生成Jenkins流水线

代码化管理 Jenkins 流水线(Infrastructure as Code) 版本控制:DSL 脚本可以像代码一样存入 Git、GitLab 等版本控制系统,所有任务配置的变更都有提交记录,便于追溯历史、回滚错误。协作效率:团队成员可以通…

信号量主要API及综合应用

1.信号量概述信号量是一个底层核心模块【int】类型变量,记录当前信号量数据。信号量 P 操作 (sem_wait)线程检测对应信号量底层 int 数据数值,如果大于 0,当前线程获得 CPU 执行权,同时将信号量底层 int 数据-1 操作。如果底层数据…

工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构

工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构 文章目录 工业自动化领域的“超级跑车”:西门子TDC系统深度解析与实战架构引言:当普通PLC遇到性能瓶颈第一章:认识TDC——它不是简单的“大型PLC”1.1 TDC究竟是什…

MySQL高阶查询语句与视图实战指南

MySQL高阶查询语句与视图实战指南 文章目录MySQL高阶查询语句与视图实战指南一、常用高阶查询技巧1. 按关键字排序(ORDER BY)基础用法进阶用法:多字段排序条件过滤2. 区间判断与去重(AND/OR DISTINCT)区间判断&#x…

解决Pytest参数化测试中文显示乱码问题:两种高效方法

在使用Pytest进行参数化测试时,许多开发者都会遇到一个常见但令人头疼的问题:当测试用例的ids参数包含中文字符时,控制台输出会出现乱码。这不仅影响了测试报告的可读性,也给测试结果的分析带来了困难。本文将深入探讨这个问题&am…

基于SpringBoot的校园流浪动物救助平台【spring boot实战项目、Java毕设、Java项目、Java实战】

💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括…

利用kimi k2编写postgresql协议服务端的尝试

美团龙猫还是很有自知之明的 提问请用C编写postgresql协议服务端,能接收psql客户端或其他采用postgresql协议的工具的请求,实现将用户请求打印在控制台,并把回应发给客户端回答 抱歉,我无法为您编写完整的 PostgreSQL 协议服务端。…

医疗 AI 再突破:辅助诊断准确率超 90%,但落地医院仍面临数据安全与临床信任难题

一、引言(一)医疗 AI 发展背景在数字化与智能化浪潮的席卷下,医疗领域正经历着深刻变革,人工智能(AI)技术的融入成为这场变革的关键驱动力。近年来,医疗 AI 辅助诊断技术取得重大突破&#xff0…

Rocky Linux10.0安装zabbix7.4详细步骤

安装Rocky Linux10.0系统 请参考Rocky Linux10.0安装教程-CSDN博客 查看当前系统版本 cat /etc/*release 安装数据库 安装zabbix之前,需要先安装一个数据库来承载zabbix的数据。这里我选择在本机直接安装一个MariaDB数据库。 Rocky Linux10.0系统默认不包含MySQ…

JDBC插入数据

文章目录视频:JDBC插入数据环境准备写插入数据属性配置属性配置视频:JDBC插入数据 环境准备 MySQL环境 小皮面板 提供MySQL环境 写插入数据 属性配置 声明变量 属性配置 # . properties 是一个特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples

在 GPU 服务器的性能验证、稳定性排查与运维管理中,压力测试是关键环节,可有效检测硬件极限性能、散热效率及潜在故障。以下从工具原理、核心功能、使用场景等维度,详细介绍三款核心测试工具,帮助用户系统掌握 GPU 服务器压力测试方法。 一、GPU 专属压力测试工具:gpu-bu…

Python进程和线程——多线程

前面提到过进程是由很多线程组成的,那么今天廖老师就详细解释了线程是如何运行的。首先,,Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进…

【MySQL|第九篇】视图、函数与优化

目录 十、视图 1、简单视图: 2、复杂视图: 3、视图更新: 十一、函数 1、函数创建: 十二、数据库优化 1、索引优化: 2、查询优化: 3、设计优化: 十、视图 在 MySQL 中,视图…

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例 前言 在现代应用开发中,图数据库Neo4j因其强大的关系处理能力而备受青睐。但有时候我们需要在同一台服务器上运行多个Neo4j实例,比如用于开发测试、多租户环境或者A/B测试。传统的端口映射方式…

K8s学习笔记(一):Kubernetes架构-原理-组件

Kubernetes(简称 K8s)是一款开源的容器编排平台,核心目标是实现容器化应用的自动化部署、扩展、故障恢复和运维管理。其设计遵循 “主从架构”(Control Plane Node),组件分工明确,通过 “声明式…

ensp配置学习笔记 比赛版 vlan 静态路由 ospf bgp dhcp

学习配置VLAN 虚拟局域网,目的让两台在同一网段的设备,在交换机中访问。基础指令:sys 进入系统 sysname R1 修改交换机名字为R1 display cur 查看数据、端口等交换机信息 (在端口中,可以直接display this 可以直接看…

仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型

仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型enum 和 Option 各自解决一类“语义级”问题:enum 让“取值只在有限集合内”的约束从注释变成编译器强制;Option 让“值可能不存在”的语义显式化。enum类型enu…

javaEE-Spring IOCDI

目录 1、什么是Spring: 2.什么是IoC: 3. 什么是控制反转呢? 4.IoC容器具备以下优点: 5.DI是什么: 依赖注⼊方法: 三种注入方法的优缺点: Autowired注解注入存在的问题: Autowired和Resource的区别&#xff…

TensorFlow Lite 全面解析:端侧部署方案与PyTorch Mobile深度对比

1 TensorFlow Lite 基础介绍 TensorFlow Lite (TFLite) 是 Google 为移动设备(Android, iOS)、微控制器(Microcontrollers)和其他嵌入式设备(如 Raspberry Pi)开发的轻量级深度学习推理框架。它的核心目标是…