Java中的IO流

Java中的IO流

计算机结构中的IO

计算机结构:运算器、控制器、存储器、输入设备、输出设备(5)

1720404859693

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后会一直等待内核把数据拷贝到用户空间

1720429001261

问题:等待的时候浪费性能

NIO(Non—blocking/New I/O) I/O多路复用模型

也有人认为属于同步非阻塞IO模型

同步非阻塞

应用会一直发送read调用直到内核把数据拷贝到用户空间

1720430951966

问题:不断read十分消耗CPU资源

I/O多路复用

线程先发起select询问内核数据是否准备就绪,数据准备就绪后在进行read(read调用期间还是堵塞的)

select大部分系统的系统调用 epoll Linux的系统调用select的增强版本

1720511287863

Java中的NIO

选择器(Selector)也叫多路复用器

当客户端数据到达后,线程才会为其服务

1720511660129

AIO(Asynchronous I/O)

基于事件和回调机制实现 应用操作后会直接返回不堵塞,当后台处理完成后操作系统通知线程进行后续操作

1720511835223

总结

1720511878991

posted @   灵泽pro  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示