Java IO模型图解(BIO NIO AIO)

news2024/11/24 16:51:50

一、冯·诺伊曼模型

如图:
在这里插入图片描述
图片来源:百度百科

输入设备向计算机输入数据,输出设备接收计算机输出的数据。
所有的计算机程序,也都可以抽象为从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中。

二、I/O模型解读

I/O 描述了计算机系统与外部设备之间通信的过程。输入与输出。
操作系统里:为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space ) 。
应用程序都是运行在用户空间,只有内核空间才能进行系统态级别的资源有关的操作。我们想要进行 IO 操作,一定是要依赖内核空间的能力。用户空间的程序不能直接访问内核空间。

从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。也就是说,我们的应用程序实际上只是发起了 IO 操作的调用而已,具体 IO 的执行是由操作系统的内核来完成的。

在这里插入图片描述

三、BIO

同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。
在这里插入图片描述
这就有个问题,一旦并发数过多,排队的时间就够呛。所以有了NIO。

四、NIO

1、同步非阻塞IO

在这里插入图片描述

同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。
但是有个问题:应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的,比如轮询了1000次read,会有极大的成本问题。就有了多路复用IO。

2、多路复用IO

在这里插入图片描述

线程首先发起 select 调用(1000个文件描述符一次性发送给内核,把用户轮询的事情放在内核中完成,减少无效调用),询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

select 调用:内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。
epoll 调用:linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率。

3、带有共享空间的NIO

在这里插入图片描述

epoll启动共享空间(mmap),把1000次连接(请求)放到红黑树内,把就绪的数据放到链表中,线程之间可以读取到。减少了IO,也减少了拷贝的阻塞。大大提升了效率。Redis的底层就是这么使用的。
还能延伸到零拷贝、kafka,这里不作过多的深入了。

五、AIO

在这里插入图片描述
异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

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

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

相关文章

热修复/热更新

热修复/热更新 一.Android热修复二.热修复框架三.类加载器0.BootClassLoader1.PathClassLoader2.DexClassLoader 四.实现思路五.代码1.FixManager2.App3.更加标准的代码 五.制作补丁包1.写段有bug的工具类,并写个点击按钮调用2.运行项目到模拟器上3.修复ToastUtils工…

node_modules插件代码修改,如何快速修改防止npm install安装覆盖代码

一、背景 有些组件不满足业务时咱们只能修改插件的源码: 直接在项目的node_modules下找到插件的源码直接修改; 优点:简单直接、快速见效;缺点:不能持久化,一旦重新npm install安装就失效;不方…

(五)ArcGIS空间数据的转换与处理——数据处理

ArcGIS空间数据的转换与处理——数据处理 目录 ArcGIS空间数据的转换与处理——数据处理 1.数据裁剪1.1矢量数据裁剪1.1.1图解1.1.2用法1.1.3操作步骤 1.2栅格数据裁剪1.2.1矩形裁剪1.2.2利用已有数据裁剪 2.数据拼接2.1矢量数据的拼接2.1.1图解2.1.2用法2.1.3 操作步骤 2.2栅格…

区块链学习三——比特币的数据结构

区块链学习三——比特币的数据结构 文章内容来源于北京大学肖臻老师《区块链技术与应用》公开课 文章目录 区块链学习三——比特币的数据结构 一、哈希指针(hash pointers)二、区块链三、Merkle tree1.Merkle tree的作用:Merkle Proof2.Proo…

2023最新版本Activiti7系列-任务分配

任务分配 1.固定分配 在指派用户任务的审批人时。我们是直接指派的固定账号。但是为了保证流程设计审批的灵活性。我们需要各种不同的分配方式,所以这节我们就详细的来介绍先在Activiti7中我们可以使用的相关的分配方式. 固定分配就是我们前面介绍的,在绘…

vr沉浸式仿真实训展厅中控系统提高课堂纪律

为解决实训教学过程中“看不到、进不去、成本高、危险大”的问题,VR智能中控系统为职业教育及高等教育老师提供一个数字化、沉浸式、集中管控的实训教学工具。 VR智能中控系统通过对VR教学课堂的实时监控、数据的收集和分析,为气象学院的教学提供更多帮助…

STM32 HAL库 使用 USB HID 配置

STM32 HAL库 HID 配置 STM32 CubeMax 配置修改USB描述符修改HID设备PID VID修改HID报告间隔修改USB报告长度发送和接收发送接收 STM32 CubeMax 配置 我这里使用的是HS接口但使用的是内部FS核。 修改USB描述符 在 usbd_custom_hid_if.c 的 CUSTOM_HID_ReportDesc_HS 或 CUSTO…

python基础----08-----json、pyecharts模块介绍以及折线图、地图、柱状图的绘制

一 python变量和json数据的相互转化 json就是 一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互、类似于: 国际通用语言 -英语。 import json if __name__ __main__:# 1. 将python变量转成json(列表->json)# 准备列表,列表内…

css background-position属性

定义 background-position 属性用于设置或获取元素背景图像相对于原点的初始位置。 background-position 基本语法 background-position:背景图片水平位置参数 背景图片垂直位置参数 ; background-position 通常使用水平方向以及垂直方向的组合来定义背…

locust的安装和运行的demo

最近开始学习locust,从最初的安装到运行一个简单的demo。 lcoust官网上有介绍安装和使用:https://docs.locust.io/en/stable/installation.html locust 需要的python环境,首先要安装python。 因为本人已经安装了python以及python…

Spring Boot集成WebSocket Demo,简单明了

如果是初次搭建Spring BootWebSocket项目,不需要太复杂,只需要快速上手,那么你搜到的大部分文章可能都不适合你,我的这篇文章以最精简的方式搭建一个可以运行并通信的Spring BootWebSocket的Demo项目,有了根基之后再进…

记录部署ChatGLM大语言模型过程

1.什么是 ChatGLM: ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB…

融合创新,着眼全局:泛工具行业增长如何顺势而为?

提到工具,你想到的是什么?办公场景中的扫描、传输、会议等工具,还是生活中帮你记录点滴、培养习惯的监督类APP,亦或者是消费支付买买买、旅游出行预订,甚至回家后的智能家居……工具类应用已经渗入我们工作生活的方方面…

数据结构与算法12:图、广度优先、深度优先

目录 【图】 【图的存储方法】 方法1:邻接矩阵 方法2:邻接链表 【图的算法】 广度优先搜索(BFS) 深度优先搜索(DFS) 【图】 在 数据结构与算法09:二叉树 这篇文章中讲述了“树”这种数…

RPC(远程过程调用)与消息队列介绍

文章目录 前言 一、过程调用分类 1.本地调用(Local Procedure Call,简称LPC) 2.远程调用(Remote Procedure Call,简称RPC) 二、API/SDK的区别是什么? 开发过程中,我们经常需要调用别人写的功能 三、WebClient 四、消息服务 目录 前言 一、过程调用分类 1.本…

excel转xmind

有如下excel,我们想把它转为xmind; 一、主流程 先说一下主要的流程: 需要把excel数据复制出来,放到文本编辑器(如notepad)中,比较乱哈,如下: 然后需要调整成如下格式…

JavaSE-04【方法】

JavaSE-04【方法】 第一章 方法 1.1 方法定义的格式详解 1、方法:就是若干语句的功能集合2、生活案例: 爆米花机: 原料:(玉米、糖) 产物:爆米花 3、方法中的两个重要名词 参数:即原料,就是进…

api接口汇总的平台

大麦网是一个在线购票平台,为音乐会、演唱会、话剧、体育比赛等各类娱乐活动提供门票销售服务。通过大麦网,用户可以轻松购买心仪的演出门票,并享受到良好的购票体验。 为了让更多用户了解到大麦网的商品详情,并能够方便地获取相…

网络协议 — IPv6 互联网协议第 6 版

目录 文章目录 目录IPv6IPv6 数据包格式固定报头扩展头部 IPv6 地址格式IPv6 网络的基本组成元素IPv6 的地址分类和寻址模式单播地址全球唯一地址(Global Unique Address)唯一本地地址(Unique Local Unicast Address)链路本地地址…

新手学习eclipse使用

目录 1 工具安装2 安装插件3 创建项目4 启动项目总结 对于新手程序员来说,选择一款趁手的工具还是有必要的。目前IDE比较好使用的是两块IDEA和eclipse,IDEA收费而且每年的费用不低,eclipse免费比较适合使用。 1 工具安装 下载地址&#xff1…