JavaIO流:模型

news2024/11/12 13:55:03

IO 的字面意思是读/写数据,IO 模型是读/写数据的方式。常用到的读/写数据方式有:同步阻塞 IO、同步非阻塞 IO、IO 多路复用、信号驱动、异步 IO

本篇内容包括:Java IO 与 IO 模型、五种 IO 模型、三种 Java IO 模型。


文章目录

    • 一、Java IO 与 IO 模型
        • 1、IO 与 IO 模型的关系
        • 2、IO 的流程
    • 二、五种 IO 模型
        • 1、同步阻塞
        • 2、非阻塞
        • 3、多路复用 IO
        • 4、信号驱动
        • 5、异步IO
    • 三、三种 Java IO 模型
        • 1、BIO
        • 2、NIO
        • 3、AIO
        • 4、适用场景分析


一、Java IO 与 IO 模型

1、IO 与 IO 模型的关系

提到 IO,就要说 IO 模型,否则就像学 Java,不讲面向对象一样,是很难全面的理解它的精髓的。

IO 的字面意思是读/写数据,IO 模型是读/写数据的方式。常用到的读/写数据方式有:同步阻塞 IO、同步非阻塞 IO、IO 多路复用、信号驱动、异步 IO

Java IO 的类库就是针对不同 IO 模型封装好的工具类。

Java IO 系统针对三种 IO 模型开发和工具类:

  1. BIO(同步阻塞 IO)
  2. NIO(同步非阻塞 IO 和 IO 多路复用)
  3. AIO(异步 IO)

这三个模型也是 Java IO 系统演化经历的三个阶段,不同 IO 模型的类库分别理解即可。

2、IO 的流程

在区分各种 IO 模型的区别之前,我们需要先了解一个 IO,在操作系统的层面究竟发生了哪些事情。注意,我们说的 IO 模型对 IO 的优化,都是基于读 IO。

假设我们需要等待 Socket 的数据,也就是说当前是一个读操作的 IO,那么在操作系统层面需要分为两步:

  1. 等待数据被写入 Socket 的缓冲区中
  2. 将 Socket 缓冲区中的数据拷贝到应用程序中

我们可以很容易的发现,第一步是由对方决定的,对方决定了什么时候把数据发送过来。第二步是由操作系统决定的,操作系统需要陷入内核态拷贝数据。

而我们的同步异步、阻塞非阻塞也是从这里出发的。

二、五种 IO 模型

1、同步阻塞

在同步阻塞的 IO 模型中,在第一阶段(等待数据被写入 Socket 的缓冲区中),操作系统会把当前的进程设置为阻塞状态,直到缓冲区被写入数据这个进程才被唤醒。

这也就造成了一个问题,当操作系统把这个进程置为阻塞态的时候,这个进程就什么事都做不了了。

2、非阻塞

为了解决 “同步阻塞” 进程可能无期限阻塞的情况,于是产生了 “同步非阻塞”。

在这种 IO 模型中,如果发现这个 Socket 里面没有准备好的数据就返回一个错误,而不是把这个进程设置为阻塞状态。

也就是说我们可以轮询这个 Socket 查看有无准备好的数据。

3、多路复用 IO

假设此时我们的服务器需要管理很多的 IO 请求,如果给每一个 IO 都分配一个进程/线程,自旋的等待有无数据到来,无疑是很浪费资源的。

如果我们用一个进程,轮询所有的 IO 请求,又会使 IO 的响应变得很慢。

因此,产生了多路复用 IO

多路复用 IO 就是用一条线程,同时监听多个 IO 请求,并且在有 IO 请求产生的时候返回。

注意,虽然我们的 IO 多路复用也会阻塞,但是这里的阻塞是应用层面的,也就是说在多路复用的方法上进行阻塞,而不是在操作系统层面去阻塞。

4、信号驱动

在以上的 IO 模型中,都是需要应用自己去询问 Socket 是否已经准备好了数据,而信号驱动就是由 Socket 主动告诉你有没有准备好数据。

这么做的好处在于第一阶段程序不需要任何的等待与轮询,只需要在收到了信号通知之后去处理这个 IO 即可。

5、异步IO

在以上的四种 IO 操作中,无论第一个阶段是如何进行优化的,在第二阶段都需要陷入内核态来拷贝数据。

异步 IO 就是为了解决这个问题。

异步 IO 在解决了阻塞这个问题后,同样把陷入内核态来拷贝数据的时间也节省了。

这样,当程序需要进行 IO 的时候,只需要发出 IO 的请求,然后就可以继续执行后面的代码,直到 IO 完成操作系统会通知程序。

同样的,异步 IO 是非阻塞的。

三、三种 Java IO 模型

1、BIO

BIO 全称是 Blocking IO,是 JDK1.4 之前的传统 IO 模型,本身是同步阻塞模式。线程发起 IO 请求后,一直阻塞 IO,直到缓冲区数据就绪后,再进入下一步操作。针对网络通信都是一请求一应答的方式,虽然简化了上层的应用开发,但在性能和可靠性方面存在着巨大瓶颈,试想一下如果每个请求都需要新建一个线程来专门处理,那么在高并发的场景下,机器资源很快就会被耗尽。

BIO 通信模型图:

img

2、NIO

NIO 也叫 Non-Blocking IO 是同步非阻塞的 IO 模型。线程发起 IO 请求后,立即返回。同步指的是必须等待 IO 缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待 IO 缓冲区,可以先做一些其他操作,但是要定时轮询检查 IO 缓冲区数据是否就绪。

Java 中的 NIO 是 new IO的意思。其实是 NIO 加上 IO 多路复用技术。普通的 NIO 是线程轮询查看一个 IO 缓冲区是否就绪,而 Java 中的 new IO 指的是线程轮询地去查看一堆 IO 缓冲区中哪些就绪,这是一种 IO 多路复用的思想。IO多路复用模型中,将检查 IO 数据是否就绪的任务,交给系统级别的 select 或 epoll 模型,由系统进行监控,减轻用户线程负担。

NIO主要有 buffer、channel、selector 三种技术的整合,通过零拷贝的 buffer 取得数据,每一个客户端通过 channel 在 selector(多路复用器)上进行注册。服务端不断轮询 channel 来获取客户端的信息。channel 上有 connect、accept(阻塞)、read(可读)、write(可写)四种状态标识。根据标识来进行后续操作。所以一个服务端可接收无限多的 channel。不需要新开一个线程。大大提升了性能。

NIO 通信模型图:

img

3、AIO

AIO 是真正意义上的异步非阻塞 IO 模型。上述 NIO 实现中,需要用户线程定时轮询,去检查 IO 缓冲区数据是否就绪,占用应用程序线程资源,其实轮询相当于还是阻塞的,并非真正解放当前线程,因为它还是需要去查询哪些 IO 就绪。而真正的理想的异步非阻塞IO应该让内核系统完成,用户线程只需要告诉内核,当缓冲区就绪后,通知我或者执行我交给你的回调函数。

AIO 可以做到真正的异步的操作,但实现起来比较复杂,支持纯异步 IO 的操作系统非常少,目前也就 windows 是 IOCP 技术实现了,而在 Linux上,底层还是是使用的 epoll 实现的。

与 NIO 不同,当进行读写操作时,只需直接调用 API 的 read 或 write 方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入 read 方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将 write 方法传递的流写入完毕时,操作系统主动通知应用程序。即可以理解为, read/write 方法都是异步的,完成后会主动调用回调函数。 在 JDK1.7 中,这部分内容成为 AIO。

4、适用场景分析

BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。

NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4 开始支持。

AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK7 开始支持。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理期末复习第三章-2(唐朔飞)

计算机组成原理期末复习第三章-2(唐朔飞) ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:&am…

电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级

近年来,在移动互联网技术不断发展、消费电子产品制造水平提高和居民收入水平增加等因素的驱动下,电子元器件行业呈现蓬勃发展的态势。未来随着5G、物联网、人工智能、虚拟现实、新型显示等新兴技术与消费电子产品的融合,这会使得行业需求量持…

linux进程间通信-FIFO,让你全方位理解

有名管道(FIFO) 有名管道也被称为FIFO文件,是一种特殊的文件。由于linux所有的事物都可以被视为文件,所以对有名管道的使用也就变得与文件操作非常统一。 (1)创建有名管道 用如下两个函数中的其中一个,可以创建有名管道。 #include #include …

python项目上线

python项目上线一 购买服务器二 使用MobaXterm连接服务器三 上线图四 安装git五 安装mysql六 安装redis七 安装python八 安装uwsgi九 安装虚拟环境十 安装nginx十一 前端部署十二 后端部署12.1 git拉取代码,安装依赖12.2 配置数据库12.3 迁移数据库12.4 使用uwsgi启…

作为微软开发者官方号,我们又要做点特别的事情了

在“感谢”二字最容易说出口的日子 谢谢每一个你,像一颗颗星星一样 点亮 MSDN 微软开发者社区的技术宇宙 我们也将在这个最值得感谢的日子 做一点特别的事情 MSDN 到底什么来头? MSDN 微软开发者社区已经成立快10年了,相信有很多资深开发…

Android服务器的通信方式

目录 一.HTTP协议 1.简介 2.Get和Post的使用 1.Get请求 2.Post请求 3.Get请求和Post请求的区别 二.Socket Socket的使用类型主要有两种: 客户端: 三.Socket 与 Http 对比 Android与服务器的通信方式主要有两种,一是Http通信&#xf…

Docker安装Gitlab-ruuner

第一步 # 拉取镜像 docker pull gitlab/gitlab-runner:latest # 启动容器 docker run -d --name gitlab-runner --restart always -v /opt/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest 第二步 查看/…

Windows 上修改 docker 的镜像文件存储位置(修改 WSL 文件映射)

Windows 上修改 docker 的镜像文件存储位置(修改 WSL 文件映射)1、起因2、修改2.1 关闭 Docker Desktop2.2 备份镜像2.3 WSL 取消注册 docker-desktop-data2.4 镜像数据导回 WSL 并挂载到新路径3、验证1、起因 一开始在 Windows 上安装了 docker 后&…

运动用品品牌排行榜,2022年值得买的运动用品推荐

如今,人们的生活节奏越来越快,工作和生活压力大。因此,人们越来越重视体育运动,通过体育运动达到放松和锻炼身体的目的,运动装备也就跟着火热起来。无论是进行室内或户外活动,选一套合适的运动装备是很有必…

【java】java 类型安全 与 unchecked warning

1.概述 1.1. What does type-safety mean? 我的总结: 从概念上来说,Type Safety,最本质上,就是对于内存(Memory)的“正确访问”。假如说,在内存的一块区域上存储着一个String类型的对象;按照正常的逻辑,这块内存区域就应该被当作String来进行处理,这就是所谓的“…

MASA Framework 事件总线 - 进程内事件总线

概述 事件总线是一种事件发布/订阅结构,通过发布订阅模式可以解耦不同架构层级,同样它也可以来解决业务之间的耦合,它有以下优点 松耦合横切关注点可测试性事件驱动 发布订阅模式 通过下图我们可以快速了解发布订阅模式的本质 订阅者将自…

nginx简单学习笔记

目录什么是nginx?反向代理负载均衡动静分离安装nginxNginx常用命令nginx.conf配置文件1、位置2 nginx配置文件组成Nginx 反向代理实例Nginx 配置实例-负载均衡nginx 分配服务器策略Nginx配置实例-动静分离nginx原理什么是nginx? Nginx是一个高性能的 HT…

【附源码】计算机毕业设计JAVA医院住院综合服务管理系统

【附源码】计算机毕业设计JAVA医院住院综合服务管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: …

第五站:操作符(第一幕)

操作符相关的知识,在我们初识C语言(第三幕)这篇文章中其实已经讲到过了。但是那一次讲解仅仅只是一些粗略的知识讲解,我们在那里面已经提到过,后续会专门超级详细的讲解操作符的知识,我们现在就来攻下操作符…

2022亚太数学杯数学建模竞赛B题(思路、程序......)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

C妈妈加密返回值逆向分析

内容仅供参考学习 目标 网址:https://www.chanmama.com/promotionDetail/0IHXaJ1y7lRNaZyiTsKa6vHtvaZDe6zy/live 直播记录接口返回值加密 分析 打开调试工具,先截获一个请求: 进入Initiator 一般情况通过这边进入函数中挨着…

HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

#边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-5 项目干系人管理

导学 重要知识点:干系人分析,干系人分类、分析技术、项目干系人管理过程的输入、工具与技术、输出等。下午的案例题可能会涉及与项目干系人管理知识点相关的简答题。 干系人管理的过程 1. 识别干系人 识别能够影响项目决策、活动或结果的个人、群体或…

Lysozyme C (46-61) (chicken),62982-31-4

AMPs是由相对较小的分子组成的异质基团,通常含有不到100个氨基酸。 它们最初是在20世纪60年代由Zeya和Spitznagel 在多形核白细胞溶酶体中描述的。 迄今为止,已在数据库(如数据库)中 确定和登记了2600多个AMP。 它们是由几乎所有的…

Mysql语法三:表的约束和表与表之间的关系以及高级查询

目录 1.表的约束 1.1:约束类型 1.2:NULL约束 1.3:UNIQUE:唯一约束 1.4:DEFAULT :默认值约束 1.5:PRIMARY KEY:主键约束 1.5.1:联合主键 1.5.2:自增主键 1.6:FORE…