【java】一文让你了解透彻Java中的IO模型

news2024/11/12 18:51:55

文章目录

  • 前言
  • 一、什么是IO
  • 二、常见的IO模型
    • BIO(Blocking IO)
      • 如何优化
      • NIO的面世
  • 三、NIO(Non-blocking/New IO)
    • 同步非阻塞IO模型
    • IO多路复用模型
    • Java中的NIO
  • 四、AIO(Asynchronous IO)
  • 总结

前言

本文只是说明了IO模型,让你了解IO模型是什么,怎么区分IO模型,以及分析了Java中的三种IO模型,没有讲述Java的IO操作,本文是纯理论知识,看完之后会让你对IO有更加深刻的理解,面试的时候就不会害怕了。

一、什么是IO

IO(Input/Output),也就是输入和输出的简称,从计算机结构的角度来看,IO,就是输入数据到计算机中,计算机输出数据到计算机外,下面有一张十分经典的冯·诺伊曼结构图,将计算机分为五大部分:运算器、控制器、存储器、输入设置、输出设备。
在这里插入图片描述

输入设备向计算机输入数据,输出设备接收计算机输出的数据。

所以,从计算机结构的角度来看IO,IO就是描述了计算机系统和外部设备之间通信的过程

接下来我们再从应用程序的角度去了解一下IO:在操作系统中,为了保证操作系统的稳定性和安全性,一个进程的地址空间被划分为了用户空间(User space)和内核空间(Kernel space)

那么什么是用户空间,什么是内核空间呢?

  • 用户空间是普通应用程序可访问的内存区域。
  • 内核空间是操作系统内核访问的区域,独立于普通的应用程序,是受保护的内存空间。

可以简单的理解为我们平常运行的应用程序,都是运行在用户空间中的,它没有权限去进行一些系统态级别的资源相关操作,比如文件管理、内存管理、等等,这些操作都是要依赖内核空间才能完成,也就是说,我们如果想要进行IO操作,一定是要依赖内核空间的能力,并且这里需要注意一点:用户空间的程序不能直接访问内核空间。

那么如果要发起一次IO操作,那应该怎么办呢?

当我们需要执行一次IO操作的时候,由于没有执行IO操作的权限,只能发起系统调用请求操作系统来帮忙完成,所以用户进程想要执行IO操作的话,必须通过系统调用来间接的访问内核空间,比如我们最常见的IO操作就是磁盘IO(读写文件)和网络IO(网络请求和响应)。

那么从应用程序的视角去看IO的话,我们的应用程序发起对操作系统的内核发起IO调用(系统调用,注意只是调用),操作系统去负责内核执行具体的IO操作。(如果这段话不是很好理解,可以理解为调包,比如别人写好了的工具类,我们不需要关注里面的实现细节,只需要调用它的方法就好了,这里我们的应用程序就是发起了一个调用,但是真正执行的还是我们的操作系统)

当应用程序发起IO调用之后,会经历下面两个步骤:(这里一定要记住这两点,它和后面息息相关!)

  • 内核等待IO设备准备好数据
  • 内核将数据从内核空间拷贝到用户空间

二、常见的IO模型

IO模型有很多种(比如在UNIX系统下,IO模型一共分为5种:同步阻塞IO、同步非阻塞IO、IO多路复用、信号驱动IO、异步IO),本篇文章只讲述Java中的IO模型,Java中的IO被分为三类:BIO、NIO、AIO。

BIO(Blocking IO)

BIO属于同步阻塞IO模型,应用程序发起read调用之后,会一直阻塞,直到内核把数据从内核空间拷贝至用户空间。
在这里插入图片描述

BIO就是Java中最传统的IO模型,相关的类和接口都在java.io这个包下面,因为现在用的人很少(后面看它的特点就知道为什么了),所以我们这里简单介绍一下它的一些特点就好了。

对高并发场景下对于线程资源的消耗较高,每一个连接需要使用一条线程单独处理。
传输较小对象时存在频繁的线程上下文切换等性能问题。

如何优化

那么怎么去优化这个BIO呢?

首先上面说了BIO的缺点之一就是它是有多少连接就需要多少线程的模型,但是对于用户来说,打开一个连接,然后关闭一个连接是十分常见且频繁的事情,而与之对应的就是创建线程和销毁线程,但是创建线程和销毁线程对于操作系统来说是十分消耗资源的,所以想到的优化就是使用线程池去进行优化BIO。

NIO的面世

但是BIO的模型决定了它的上限,它始终是同步阻塞的IO模型,阻塞就会导致不能使用单线程处理多个请求,所以这个时候就需要修改它的模型,将调用read()、write()方法不再是阻塞的,这样就可以使用单线程处理多个请求,而这样就不再是同步阻塞的IO模型了,也就是我们下面要说到的NIO了。

三、NIO(Non-blocking/New IO)

Java的NIO是Java1.4引入的,对应的是java.nio包,提供了channel、selector、buffer等抽象。
Java中的NIO可以看作是IO多路复用模型,但是也有人认为它是同步非阻塞IO模型,这里我们先简单介绍一下这两种模型:

同步非阻塞IO模型

在这里插入图片描述

这个相比同步阻塞IO模型,同步非阻塞IO模型就是通过轮询的方式,避免了一直阻塞。

但是从图中也能看出问题所在,就是应用程序不断的进行IO系统调用轮询数据是否已经准备就绪的这段时间,是十分消耗CPU资源的(说白话就是反复调用read操作) 。
所以这个时候就引入了IO多路复用模型。

IO多路复用模型

在这里插入图片描述

在IO多路复用模型中,线程首先发起select调用,询问内核数据是否准备就绪,等待内核把数据准备好了,会返回一个ready调用,告诉你,我准备好了,这个时候用户线程再发起read调用。注意:read调用的过程依然是阻塞的(数据从内核空间拷贝至用户空间这段时间) 。

IO多路复用模型通过无效的系统调用,减少了对CPU资源的消耗。

Java中的NIO

Java中的NIO,有一个十分重要的概念,就是选择器(selector),也被称为多路复用器,通过它就可以实现使用一个线程管理多个客户端连接(这里是不是和BIO就不一样了,最大的优化的点就在这里) 。当客户端数据到了之后,线程再为客户端进行服务。
下面给出一张JavaNIO的图:
在这里插入图片描述

这张图就能很好的说明了NIO的特点了。

四、AIO(Asynchronous IO)

AIO,也被称为NIO 2.0,Java7中引入的异步IO模型,很多人都不理解非阻塞IO和异步IO到底有什么差别,其实异步IO就是基于事件和回调机制去实现的,也就是说用户调用操作之后会立马返回,不会阻塞,当后台处理完成,操作系统会通知相应的线程进行后续操作。
在这里插入图片描述

目前来说AIO的应用还没有十分广泛,应用最多的是NIO。

总结

最后放一张图来总结Java中的IO模型:
在这里插入图片描述

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

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

相关文章

不要一昧的给孩子做骨密度检查,这些情况才要做

国内,骨密度检测应用非常广泛。也成了很多医院儿科常规的体检项目之一。而在儿科领域,对骨密度检查的必要性、临床参考意义一直颇有争议。 有专家说,“孩子需要及时检测骨密度,但是要用科学有效的检测方式……只有双能X线的检测方…

BetaFlight统一硬件配置文件研读

BetaFlight统一硬件配置文件研读 1. 源由2. 分析2.1 硬件SOC2.2 统一配置文件2.3 cli命令2.4 板级配置主要命令2.4.1 board_name2.4.2 manufacturer_id2.4.3 resource2.4.4 timer2.4.5 dma2.4.6 serial2.4.7 set2.4.8 feature 3. 实例研读3.1 C遗留配置3.2 BoardName - AOCODAR…

asp.net+C#基于web的失物招领系统ccA1A9程序

根据分析,该系统应该有二个角色:管理员、注册用户。系统需要赋予他们对应的功能和权限,具体如下: 管理员具有:管理管理注册用户、管理新闻模块、管理留言的功能和权限。 具有:浏览新闻、管理失物信息、参与…

【Linux内幕】DMA原理

1.前言 I/O设备与主存信息传送的控制方式分为程序轮询、中断、DMA、RDMA等。 2.DMA介绍 DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之…

GAT1400-视图库标准

一、简述: GA/T 1400是于2017年首次发布关于图片、视频片段、文件等属性对象的传输协议。 GA/T 1400《公安视频图像信息应用系统》分成4个部分: 第一部分–通用技术要求; 第二部分–应用平台技术要求; 第三部分–数据库技术要…

前端学习之使用JavaScript

前情回顾:网页布局 JavaScript 简介 avaScript诞生于1995年,它的出现主要是用于处理网页中的前端验证。所谓的前端验证,就是指检查用户输入的内容是否符合一定的规则。比如:用户名的长度,密码的长度,邮箱的…

刘强:作业帮给OceanBase提了九条意见

3 月 25 日,第一届 OceanBase 开发者大会在北京举行, 作业帮数据库架构师刘强为大家带来了《作业帮基于 OceanBase 的 HTAP 实践》的分享 ,为大家介绍了 OceanBase 上线作业帮半年来的体验与心得。 以下内容由大会演讲整理而成: …

提示工程玩转 ChatGPT

Prompt engineering is the skill of the future. 目录: 1. 简介 (Introduction) 2. 提示指南 (Prompt Guidelines) 2.1 指令要清晰明确 2.2 给模型时间思考 3. 迭代提示 (Iterative Prompt) 3.1 迭代过程 3.2 案例展示 4. 文本概括 (Text Summarization) 4.1 单文本…

五个有用的工具帮助您提高代码质量

前言 对于开发人员而言,代码质量一直是一个非常重要的话题。高质量的代码不仅可以提高应用程序的性能,还可以减少代码错误和维护成本。然而,如何确保代码质量呢?下面介绍五个有用的工具,可以帮助您提高代码质量。 So…

SLAM论文速递:SLAM—— NICER-SLAM: RGB SLAM的神经隐式场景编码—5.04(1)

论文信息 题目: NICER-SLAM:Neural Implicit Scene Encoding for RGB SLAM NICER-SLAM: RGB SLAM的神经隐式场景编码论文地址: https://arxiv.org/pdf/2302.03594.pdf发表期刊: Computer Vision and Pattern Recognition (cs.CV)标签 xxxx…

机器学习:协同过滤推荐算法

目录标题 题目:使用协同过滤(基于用户)构建简单的电影推荐系统1.1.1 实验目的1.1.2 实验内容及步骤1.1.3 程序运行过程、方法和运行结果1.1.4 实验小结 题目:使用协同过滤(基于用户)构建简单的电影推荐系统…

详解Mybatis之参数传递问题

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 目录 一. Mybatis中参数传递问题1.1 单个普通参数传递1.2 多个普通参数传递1.3 命名参数1.4 POJO(java Bean…

MySQL知识学习02(MySQL索引详解)

1、索引介绍? 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字&…

鸿蒙Hi3861学习四-Huawei LiteOS介绍

一、什么是LitesOS Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力。基于物联网领域业务特征打造领域性技术栈,为开发者提供“一…

MEET开发者 | 从无代码小白到大神,95后精神小伙的职场初体验

「无代码开发者故事」第一期的嘉宾是一位初入职场的95后,他保留了白羊座直率、热情的孩子天性,即便长期驻场也能“苦中作乐”,发挥自己旅游和摄影的爱好。初入职场的他在项目中主要承担需求分析的角色,2021年初受公司委派学习和评…

VR全景展示--探索无限可能

随着科技的发展,虚拟现实(Virtual Reality,简称VR)技术逐渐成为人们关注的焦点。VR技术使得人们可以在虚拟现实中体验到与现实世界不同的感官体验。在VR全景展示中,观众可以通过虚拟现实技术,沉浸式地感受到…

指针函数和函数指针

本文目录 • 前言 • 一、返回指针的函数 二、指向函数的指针回到顶部 一、返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) 比如下面这个函数&#…

用手机号码归属地 API 开发的应用推荐

引言 手机号码归属地 API是一种提供手机号码归属地信息的接口,通过该接口,可以获取手机号码所属的省份、城市、运营商等信息。它可以帮助企业更好地了解客户,为个性化推荐和精准广告投放提供数据支持。作为一种数据服务,手机号码…

打造高可用、高效的Nginx反向代理应用 - 实战篇

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人 &#xff0c…

快排代码原理实现

参考博客:快速排序算法详解(原理、实现和时间复杂度) 排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)。为了方便,我们一般选择第 1 个…