javaI/O|day2. javaI/O模型、 具体I/O流程、 具体模型

news2024/11/20 9:46:30

文章目录

  • javaI/O模型
    • 定义
    • 具体I/O流程
      • 图示
      • 过程
      • 讲解
    • 具体模型
      • I/O调用两个阶段
      • 同异步
      • 阻塞非阻塞
      • BIO(同步并阻塞)
      • NIO(同步非阻塞)
      • AIO(异步非阻塞)

javaI/O模型

定义

用什么样的通道或者通信模式和架构进行数据的传输和接收,很大程度上决定了程序的性能

具体I/O流程

图示

在这里插入图片描述

过程

  1. 进程发起一个系统调用sys_read,读磁盘数据;

  2. DMA将磁盘文件数据拷贝到内核空间的read缓冲区;

  3. CPU把内核空间read缓冲区数据拷贝到用户空间的缓冲区;

  4. 进程发起一个系统调用socket_write,向网卡写数据;

  5. CPU把用户空间缓冲区的数据拷贝到内核空间的socket缓冲区;

  6. 最后DMA把内核空间的socket缓冲区数据拷贝到网卡;

讲解

  1. read系统调用发起,此时进程发生一次上下文切换,由用户态切换到内核态。

  2. 进程从磁盘拷贝数据完毕后,read系统调用返回,此时又从内核态切换到用户态,并把磁盘数据从内核空间拷贝到用户空间。

IO读操作完成

  1. 进程由用户态切换到内核态,将用户空间中的数据拷贝到内核空间中的Socket缓冲区,

  2. 然后将数据发送给网卡。

开始往网卡里写数据

在整个IO读写过程中进行了四次上下文切换,用户态–内核态–用户态-内核态-用户态

具体模型

I/O调用两个阶段

  • 内核等待I/O准备好数据

  • 内核将数据从内核拷贝到用户空间

同异步

在这里插入图片描述

  1. 同步

同步方法会一直阻塞进程,直到I/O操作结束,注意这里相当于上面的阶段1,阶段2都会阻塞调用者。其中BIO,NIO,IO多路复用,信号驱动IO,这四种IO都可以归类为同步IO(也就是说进程只能先进行当前I/O操作)

  1. 异步

而异步方法不会阻塞调用者进程,即使是从内核空间的缓冲区将数据拷贝到进程中这一操作也不会阻塞进程,拷贝完毕后内核会通知进程数据拷贝结束。(也就是说,进程可以在处理当前I/O时处理其他事情)

阻塞非阻塞

在这里插入图片描述

  1. 阻塞

阻塞调用会一直等待远程数据就绪再返回,即上面的阶段1会阻塞调用者,直到读取结束(也就是发送者如果不说结束的话,就不会结束)

  1. 非阻塞

而非阻塞无论在什么情况下都会立即返回,虽然非阻塞大部分时间不会被block,但是它仍要求进程不断地去主动询问kernel是否准备好数据,也需要进程主动地再次调用recvfrom来将数据拷贝到用户内存。(也就是说发送者就算不说结束,只要当前数据发送完就会先让当前进程去处理其他事情)

同步阻塞就是我在等待当前线程干完这件事情之前不会离开.同步非阻塞就是我在当前线程干完这件事情之前,我可以去干其他的事情,但是必须时常回来看看进度.异步非阻塞,就是我在线程干这件事情的时候,我可以去干其他事情,然后等待线程通知我说这件事情已经办完了,然后再去处理.

BIO(同步并阻塞)

实现模式

为连接一个线程,客户端有连接请求时服务器端就要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销

具体样式

在这里插入图片描述

小结

  • 每个Socket接收到,都会创建一个线程,线程的竞争,切换上下文影响性能

  • 每个线程都会占用栈空间和cpu资源

  • 并非每个socket都会进行I/O操作,无意义的线程处理(服务端会一直处于阻塞状态)

  • 客户端并发访问增加时,服务端会呈现1:1的线程开销,访问量越大,系统将会线程栈溢出,线程创建失败,最终导致进程宕机或僵死,从而不能对外提供服务

伪异步I/O编程

方法

采用线程池和任务队列可以实现伪异步I/O编程(相当于多个同步线程实现了一个异步线程的功能)

原理

当客户端接入时,将客户端的Socket封装成一个Task( 该任务实现java.lang.Runable线程任务接口)交给后端的线程池中进行处理。JDK 的线程池维护一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

模式

在这里插入图片描述

问题

伪异步I/O通信框架采用了线程池实现,因此避免了为每个请求都创建一个独立线程造成的线程资源耗尽问题。不过因为它的底层仍然是同步阻塞的BIO模型,因此无法从根本上解决问题。

如果单个消息处理缓慢,或者服务器线程池所有线程都被阻塞,那么后续socket的I/O消息都会在消息队列中排队,新的socket请求会被拒绝,客户端会发生大量连接超时

NIO(同步非阻塞)

概念

提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)情况下,应使用 NIO 。(相当于当前线程在没有事情做的时候,可以被调用去做其他事情)

模式

在这里插入图片描述

三大核心

  1. channel(通道)

    • 功能

      NIO 通过Channel(通道)对缓冲区进行读写。

    • 操作

    在这里插入图片描述

    • 特点

      通道是双向的,可读也可写

  2. Buffer(缓冲区)

  • 功能

    Buffer是一个对象,它包含一些要写入或者要读出的数据。

  • 操作

    在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。

  • 特点

    NIO的缓冲区是直接缓冲:是os和jvm之间直接通过物理内存映射文件开辟的一块存储区域,像访问内存一样访问,所以速度快,但存在不安全和占用cpu的缺点,如果文件过大容易造成cpu卡死。

  1. Selector(选择器)
  • 功能

    选择器用于使用单个线程处理多个通道。(是非阻塞式I/O的核心)

  • 操作

在这里插入图片描述

  • 特点

    Select可以检测多个注册的通道上是否有事件发生,如果有事件发生,以便获取事件然后进行相应的处理(管理多个连接和请求)

    只有在连接或者通信,有真正的读写事件发生时才会进行读写操作,大大减少了系统开销,并且不比为每一个连接都创建一个线程,不用去维护多个线程

    避免了多线程之间的上下文切换导致的开销

AIO(异步非阻塞)

AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

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

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

相关文章

36k Star的开源大模型应用开发平台,太强了!

引言 Dify是一款开源的大语言模型(LLM)应用开发平台,它帮助开发者和非技术人员,快速构建生产级别的生成式AI应用。 该项目设立于2023 年 3 月,开源协议是基于 Apache License 2.0 有限商业许可,后端技术P…

nginx自动续期ssl证书

🔴 大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 🔴前言 前年,阿里将免费的ssl证书从一年调整成了三个月; 去年,腾讯将免费的ssl证书从一年调整成了三个月; 以…

【文献阅读】Balancing the Scales: HyperSMOTE for Enhanced Hypergraph Classification

Abstract 真实用户与机器人数量之间的固有不平衡带来了巨大的挑战,常常导致分类器的偏差。本文引入了HyperSMOTE,这是一种利用超图丰富结构的不平衡节点分类的新方法。通过将X平台用户表示为节点,并将他们的互动表示为超边,构建了…

给水排水杂志

一、基本信息 《给水排水》创刊于1964年,是国内创刊早、发行量大、内容涵盖广的水行业权威期刊,在业内享有盛誉。期刊现由中国建设集团股份有限公司主管,亚太建设科技信息研究院有限公司、中国土木工程学会主办。现任名誉主编&#xff1a…

【Java】深度解析Java的反射机制

反射(Reflection) 一、 反射的基本概念二、 获取类的信息三、 获取类的成员四、 动态创建对象五、 动态调用方法六、 动态访问和修改字段 总结 一、 反射的基本概念 反射是一种运行时机制,允许程序在运行时检查和操作类、方法、字段等。通过…

告别异地烦恼,这四款远程控制工具一键掌控千里之外的电脑!

现在的科技水平真是越来越强大了,以前都是必须要在电脑跟前才可以解决的问题,现在可以安装通过远程控制的软件来实现在家就可以办公,解决了这当中的时间和金钱成本,所以今天就具体来聊聊四款好用的远程控制工具,协助我…

学python的第一天:PyCharm创建项目

创建项目 打开工具 PyCharm 点击“新建项目” 点击“创建” 环境 系统会创建虚拟环境,稍等 初始设置 创建完成后会进入main.py文件 性能 可以看到 右下角提示我们增强性能,点“自动” 会获取到管理员权限 完成后会提示完成

CAS单点登录

1.相同顶级域名的单点登录SSO 相同顶级域名的单点登录:SSO:SINGLE SIGN ON 单点登录可以通过基于用户会话的共享;分为两种,第一种:相同顶级域名; 原理是分布式会话完成的;关键是顶级域名的cookie值是可以共享的 比如…

7月小游戏畅销榜Top 100:MMO游戏数量增多,26款新入榜

易采游戏网8月4日消息:2024年7月的小游戏畅销榜Top100已经揭晓,给广大游戏玩家带来了不少惊喜和期待。与上个月相比,本月的榜单不仅新入榜游戏数量达到了26款,还显示了MMO(大型多人在线)游戏的强劲增长趋势…

deform,一个超强的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个超强的 Python 库 - deform。 Github地址:https://github.com/Pylons/deform 在 Web 开发中,表单处理是一个常见且重要的任务。deform 是一个用于生…

巧用casaos共享挂载自己的外接硬盘为局域网共享

最近入手了个魔改机顶盒,已经刷好了的armbian,虽然是原生的,但是我觉得挺强大的,内置了很多 常用的docker和应用,只需要armbian-software 安装就行,缺点就是emmc太小了。 买到之后第一时间装上了casaos和1panel,想把外接移动硬盘挂载到局域网,只需: 1、安装必要的sam…

Parallels Desktop19让你的Mac无缝运行Windows!

大家好,我是你们的科技小伙伴,今天我要给大家安利一款神奇的软件——Parallels Desktop 19虚拟机。这款产品真的是让我眼前一亮,用起来简直不能更爽! 让我们来聊聊为什么我们需要一个虚拟机。 想象一下,你是一个Mac用…

牛顿插值法代替泰勒公式

引入 例题 近似函数: 通过这个近似函数可以看出,若要证的函数超过二阶可导,那么就不适合用牛顿插值法代替泰勒公式 因为,后面的操作非常复杂,不划算了… 总结 我们可以通过牛顿插值法生成一个逼近曲线的直线&#xf…

贷款申请被拒,是银行故意在找茬吗?

贷款申请被拒,很多时候真不是银行故意找茬,而是咱们自己的一些“小动作”不经意间就把路给堵窄了。今天,咱们就来聊聊那些可能让贷款之路变得坎坷的“坑”,帮你顺利绕开它们。 首先,得说说那个最让人头疼的——逾期还款…

“数字孪生+大模型“:打造设施农业全场景数字化运营新范式

设施农业是一个高度复杂和精细化管理的行业,涉及环境控制、作物生长、病虫害防治、灌溉施肥等诸多环节。传统的人工管理模式已经难以应对日益增长的市场需求和管理挑战。智慧农业的兴起为设施农业带来了新的机遇。将前沿信息技术与农业生产深度融合,实现农业生产的数字化、网络…

立项技术路线选择

本章主要是简单聊聊技术路线,额涉及unity和虚幻,目的主要是给自己看的,记录下日期:2024.8.4 在今天,除游戏以外的厂商基本上采用c#的混合技术方案 如果需要的设备对象多。效果不需要极为精细,至少unity是绝…

从根儿上学习spring 八 之run方法启动第四段(2)

图2 我们接着上一篇接着来看refresh方法,我们上一小节说完了invokeBeanFactoryPostProcessors(beanFactory)方法,这一节我们来看registerBeanPostProcessors(beanFactory)方法。 从方法名称定义我们就能看出这个方法主要是用来注册BeanPostProcesor的。…

欧拉图,欧拉通路,欧拉回路,Hierholzer算法详解

文章目录 零、哥尼斯堡七桥问题一、欧拉图1.1 相关概念1.2 判别法(不做证明)1.3 Hierholzer算法1.4 代码实现1.4.1 邻接表存图1.4.2 链式前向星存图 二、OJ练习2.1 模板12.2 模板22.3 重新安排行程2.4 合法重新排列数对2.5 破解保险箱2.6 骑马修栅栏2.7 …

WebVirtMgr管理多台物理机

这篇文章只是讲一讲管理多台物理机遇到的坑,记录一下。目前时间紧张,空余时间再补充细节。 WebVirtMgr管控单台物理机很多文章能搜到,写的也都挺好。 管理多台的具体步骤我没碰到过,只能按照报错去一步步解决。 第一个问题&…

2024睿抗国赛赛后总结

题目可以去pta教育超市找 写第一题还很清醒。&#xff08;耗时15分钟&#xff09; #include<bits/stdc.h> using namespace std; string s; int sum 0,len 0; int cnt 0;int check(char c){if(c > a && c < z){return 1;}else if(c < Z &&…