Java中的IO流
Java中的IO流
计算机结构中的IO
计算机结构:运算器、控制器、存储器、输入设备、输出设备(5)
I/O描述了计算机系统与外部设备之间的通行过程
应用程序中的I/O
一个进程的地址空间划分为用户空间和内核空间
用户空间是我们平时的程序运行的地方,只有内核空间有权限进行系统态级别的操作即IO操作必须依赖内核空间进行
用户空间不能直接访问内核空间,需要通过系统调用间接访问内核空间
应用程序发起IO操作调用,内核空间等待IO设备准备好数据,内核将数据从内核空间拷贝到用户空间
常见的IO模型
Linux系统中有同步阻塞I/O,同步非阻塞I/O,I/O多路复用,信号驱动I/O,异步I/O
补充知识点同步、异步、阻塞与非阻塞
同步
- 同步操作意味着在操作完成之前,调用者会一直等待。例如,当应用程序需要读取文件时,若使用同步读取,应用程序会暂停执行直到数据被完全读取。同步操作通常简单直接,但可能导致效率低下,因为调用者必须等待操作完成才能进行下一步。
- 一个典型的例子是在B/S架构中,客户端发出请求并等待服务器响应,客户端在等待期间无法执行其他操作。
异步
- 异步操作允许调用者在启动操作后继续执行其他任务,不需要等待操作完成。当操作完成时,系统会通过某种机制(如回调函数或通知)告知调用者。这种模型在需要高并发处理的应用程序中特别有用,例如Node.js就广泛使用异步操作来提高性能。
- 使用异步操作的例子包括ajax请求,用户无需等待服务器的响应即可进行页面上的其他操作。
阻塞
- 阻塞操作指在操作完成之前,当前线程或进程会被挂起,即不能执行任何其他操作。这样,在等待数据或资源的过程中,处理器不执行任何实际计算。阻塞操作通常用在简单的场景中,但可能在资源等待时间过长时造成资源浪费。
- 例如,读取文件时,如果采用阻塞模式,那么在数据读取完成之前,程序将无法继续执行后续代码。
非阻塞
- 非阻塞操作允许线程或进程在操作未完成时继续执行其他任务。此模式通常用于复杂的、多任务的系统中,以最大化资源利用率。非阻塞操作可能需要更复杂的管理逻辑,因为必须在操作完成后协调结果的处理。
- 举例来说,非阻塞的文件读取会在数据未完全读取时立即返回,允许程序进行其他计算或读取其他文件。
Java中常见的IO模型
BIO(Blocking I/O) 同步阻塞IO模型
同步阻塞IO模型中,程序发起read后会一直等待内核把数据拷贝到用户空间
问题:等待的时候浪费性能
NIO(Non—blocking/New I/O) I/O多路复用模型
也有人认为属于同步非阻塞IO模型
同步非阻塞
应用会一直发送read调用直到内核把数据拷贝到用户空间
问题:不断read十分消耗CPU资源
I/O多路复用
线程先发起select询问内核数据是否准备就绪,数据准备就绪后在进行read(read调用期间还是堵塞的)
select大部分系统的系统调用 epoll Linux的系统调用select的增强版本
Java中的NIO
选择器(Selector)也叫多路复用器
当客户端数据到达后,线程才会为其服务
AIO(Asynchronous I/O)
基于事件和回调机制实现 应用操作后会直接返回不堵塞,当后台处理完成后操作系统通知线程进行后续操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)