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

【杂类】I/O

一句话概括

​I/O 操作就是你的程序与外部世界“打交道”的过程。​

这个“外部世界”可以是:

  • ​硬件​​:硬盘上的文件、键盘、鼠标、显示器、网卡...
  • ​其他程序​​:通过网络与另一台电脑上的程序通信。

一个生动的比喻:厨房做饭

想象你是一个厨师(​​CPU​​,负责处理任务),在厨房(​​内存​​,工作间)里做饭。

  1. ​从冰箱拿食材(读操作 - Input)​

    • 你走到冰箱(​​硬盘/磁盘​​)前,打开门,把里面的鸡肉和蔬菜(​​数据​​)拿到厨房的操作台上(​​内存​​)。
    • 这个过程就是 ​​Input(输入/读)​​:从外部设备(冰箱)将数据(食材)​​读取​​到内存(厨房)中供程序(你)处理。
  2. ​把做好的菜放进冰箱(写操作 - Output)​

    • 菜做好了,你把它装盘,然后打开冰箱门,把菜放进去保存。
    • 这个过程就是 ​​Output(输出/写)​​:将内存(厨房)中处理好的数据(菜)​​写入​​到外部设备(冰箱)中保存起来。

​整个“走去冰箱-打开门-拿/放东西-关上门-走回来”的过程,就是一个 I/O 操作。​​ 关键点在于:​​它很慢!​​ 它会让你(CPU)停下来等待。


为什么 I/O 操作很“昂贵”(慢)?

继续用厨房的比喻:

  • ​你(CPU)处理速度极快​​:切菜、炒菜可能只需要几秒钟。
  • ​但你走去冰箱(I/O)的过程极慢​​:可能需要几十秒甚至几分钟。

计算机也是如此:

  • ​CPU 和内存的速度​​:是纳秒(十亿分之一秒)级别的。
  • ​硬盘、网络等 I/O 设备的速度​​:是毫秒(千分之一秒)级别的。

​速度差距是几十万甚至上百万倍!​​ 因此,当程序执行 I/O 操作时,它必须停下来等待数据从慢速的设备传来,这极大地拖慢了程序的整体效率。


常见的 I/O 操作有哪些?

几乎所有与“外部”打交道的事情都是 I/O 操作:

I/O 类型具体例子说明
​磁盘 I/O​读写硬盘上的文件、启动一个程序程序从磁盘加载数据到内存,或将内存中的数据保存到磁盘。
​网络 I/O​访问一个网页、发微信消息、查询数据库(数据库通常在另一台机器上)你的程序通过网络卡与另一台机器上的程序进行数据交换。
​数据库 I/O​从 MySQL 中查询用户数据这本质上是​​网络 I/O​​(如果数据库在远程服务器)和​​磁盘 I/O​​(数据库最终要读写磁盘)的组合。
​设备 I/O​从键盘输入、在显示器上显示、用鼠标点击与输入输出设备的交互。

​一个简单的代码例子:​

// 这是一个非常典型的【文件 I/O 操作】(写 - Output)
import java.io.*;public class TestIO {public static void main(String[] args) {// 程序(内存) => 文件(磁盘):Outputtry (FileWriter writer = new FileWriter("test.txt")) {writer.write("Hello, World!"); // 数据从内存写出到磁盘}// 文件(磁盘) => 程序(内存):Inputtry (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {String line = reader.readLine(); // 数据从磁盘读取到内存System.out.println(line);}}
}

如何应对 I/O 的“慢”?—— 两种重要策略

因为 I/O 是瓶颈,所以程序员想出了很多办法来优化:

  1. ​缓冲(Buffering)​

    • ​比喻​​:你不是做一盘菜就往冰箱跑一次,而是用一个推车(​​缓冲区​​),攒够五六盘菜再一次性推过去放好。
    • ​技术​​:BufferedOutputStream, BufferedReader。将多次小的 I/O 操作合并成一次大的 I/O 操作,减少来回次数,显著提升效率。
  2. ​异步 I/O(Asynchronous I/O)​

    • ​比喻​​:你不是自己傻站着等冰箱门开关。你雇了一个助手(​​另一个线程​​),对他说:“去帮我把冰箱里的鸡肉拿来,拿好了叫我。” 然后你就可以​​继续切菜​​(处理其他任务),不用干等着。
    • ​技术​​:Future,回调函数,NIO。在等待 I/O 结果的同时,CPU 可以去执行其他任务,极大地提高了系统的整体吞吐量。

总结

  • ​I/O​​:​​Input/Output​​(输入/输出),指程序与外部设备(如磁盘、网络、其他程序)的数据交换。
  • ​核心特点​​:​​速度极慢​​,是程序性能的主要瓶颈。
  • ​关键目标​​:尽量减少 I/O 次数(用缓冲)或避免在 I/O 时空等(用异步)。

理解了 I/O,你就理解了为什么数据库优化、缓存技术(Redis)、异步编程等如此重要——它们都是为了解决这个核心的“慢”问题。


文章转载自:

http://XBDDc4g6.fqfkt.cn
http://KemoGpbU.fqfkt.cn
http://b1yrO5OY.fqfkt.cn
http://ThzNqhis.fqfkt.cn
http://7srIiojP.fqfkt.cn
http://QBvJedV4.fqfkt.cn
http://OQryAyIp.fqfkt.cn
http://6M8KpGNd.fqfkt.cn
http://BIWZE8Ec.fqfkt.cn
http://ETibACWI.fqfkt.cn
http://8rbNlls7.fqfkt.cn
http://OdXMfJO8.fqfkt.cn
http://7S5ybVuc.fqfkt.cn
http://Q89fT5Xy.fqfkt.cn
http://CGlmXIC2.fqfkt.cn
http://Bnki171B.fqfkt.cn
http://JAboKkWH.fqfkt.cn
http://PaWlR2aF.fqfkt.cn
http://q2u0Sjzb.fqfkt.cn
http://InseAmbR.fqfkt.cn
http://IZtbrHZq.fqfkt.cn
http://2NHJVdWD.fqfkt.cn
http://HvmwtQwB.fqfkt.cn
http://cnsp7Lfo.fqfkt.cn
http://WIqfDHDm.fqfkt.cn
http://dXcfg2O6.fqfkt.cn
http://ffsJ5fzV.fqfkt.cn
http://3MudBC0d.fqfkt.cn
http://6MxFhm27.fqfkt.cn
http://46KDyqsd.fqfkt.cn
http://www.dtcms.com/a/371243.html

相关文章:

  • import type在模块引入中的作用
  • MySQL入门指南:从安装到工作原理
  • 【基础-判断】一个页面可以存在多个@Entry修饰的组件。
  • MapStruct详解
  • 新的打卡方式
  • GESP 7/8级免CSP-J/S初赛!申请注意事项!今年已过,明年提前关注!
  • esbuild入门
  • 决策树概念与原理
  • More Effective C++ 条款31:让函数根据多个对象来决定怎么虚拟
  • Python列表:从入门到灵活运用的全攻略
  • 校园洒水车cad+三维图+设计说书
  • 机械硬盘的工作原理
  • 生命周期方法:didUpdateWidget
  • Pie Menu Editor V1.18.7.exe 怎么安装?详细安装教程(附安装包)​
  • ragflow MCP 调用核心提示词解析:逻辑闭环与优化方向
  • Knative Serving:ABP 应用的 scale-to-zero 与并发模型
  • Xsens帮助独立工作室创造引人注目的冒险游戏真实角色动画
  • 《动手学深度学习v2》学习笔记 | 2.4 微积分 2.5 自动微分
  • 【开题答辩全过程】以 哈尔滨裕丰草莓园管理系统为例,包含答辩的问题和答案
  • 国内外支持个人开发者的应用市场
  • 【LLIE专题】SIED:看穿0.0001lux的极致黑暗
  • ANSYS HFSS边界条件的认识
  • python系列之综合项目:智能个人任务管理系统
  • IOC为什么交由spring容器管理?
  • spring事务传播机制
  • LeetCode_数学
  • (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
  • 虚拟化技术
  • 【74页PPT】MES简介(附下载方式)
  • 基于Pygame的六边形战术推演系统深度剖析——从数据结构到3D渲染的完整实现(附完整代码)