IO模型的分类以及各个io模型之间的优劣势

news2024/11/25 4:53:45

本文主要讲解bio以及nio的一些问题和知识,会对aio进行简单讲解,但不会深入剖析

我们说熟知的io模型有哪些呢?

  • 同步阻塞io
  • 同步非阻塞io
  • 同步多路复用
  • 异步非阻塞io

java的io本身是不具有真正的io操作能力的,当调用io操作时,仍然需要切换到底层做系统去调用真正的io操作才可以实现一次io读取或者写入操作的

 

这里注意啊,有些地方还有一个说法,是异步阻塞io,这个说法是错误的啊,异步是不会存在阻塞行为的,所以以后听到异步阻塞,你就可以开始怼他了,好了,废话不多说,正文开始!

一,同步阻塞io

什么是同步阻塞io呢,首先声明,我们的全部说法都是建立与单线程模式下的情况,这样更易于理解

我拿一次网络写入操作举例啊:我们首先肯定是先要建立连接,然后再去读取客户端传过来的数据,假如现在过来两次读取请求,需要同一个线程处理,那么第一个请求建立了连接,进到了第二个读取操作,这个时候,客户端的数据还没有发过来,因为这两个方法都是阻塞的(建立连接和读取数据),那么因为第一个请求的读取操作还未处理完,线程就会一直阻塞在读取这,那么第二个线程也无法建立连接,必须等待,第一个请求处理完才可以连接到服务端

从图可知,读取操作时,如果未读取到数据,会在等待数据阶段一直阻塞,直到操作系统拿到数据复制数据后返回数据 

二,同步非阻塞io

任然以写入数据为例,与阻塞io不同,非阻塞io假如我们第一个请求还未发过来数据,那么也不会一直阻塞在读取操作,会继续往下走,去建立新的连接,但是也存在弊端,就是,如果不管有没有收到客户端的数据,它都会去读一次数据,这个不同的循环读取,做一些无意义的操作,就将服务器资源浪费掉了,增加了cpu的开销和压力,这个时候就出现了多路复用

从图可知,当未获取到数据时,不会阻塞,而是继续往下执行,连接读取的操作,但是会造成资源浪费 ,等待数据阶段不会阻塞,但是仍然复制数据时阻塞

三,多路复用

其实多路复用仍然是基于同步非阻塞模型的,只不过在nio的基础上引入了select模型,通过它可以做到同时处理多个channel通道的操作,通过将通道绑定到selector上,通过返回的selectkey绑定具体的操作事件,将事件全部存储到selector中,通过select()方法进行阻塞,假如目前没有操作,就会一直阻塞,事件过来时,继续通过selectkey去获取到进来的所有事件,然后去判断具体的操作事件,执行的具体的操作

 

四,异步非阻塞io

其实就是我们所熟知的aio,这个东西怎么说呢,目前的linux上对异步的支持不是那么好,虽然在2.6引入了异步的概念,但实际上还是基于多路复用的一个模拟罢了,并不是真正意义上的异步io,而真正实现aio的只有windows系统,微软在windows上通过IOCP的方式对异步做了真正意义的实现,但是大家都懂,大部分的java程序,都运行在linux上,所以,aio到目前为止,java的支持并不是特别好,事实上之前netty有通过2.6引入的异步模型做过实现,但是发现netty5的版本性能并未提升,反而增加了维护成本,所以在维护了一段时间后,果断废弃掉了5的版本,所以目前netty的主要版本还是4

异步io的实质:线程不去自己获取结果,而是有其他线程送结果(所以至少两个线程)

 这个图可以很清晰的明白aio的本质

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

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

相关文章

基于ArcGIS:GIS空间分析复习-理论概念+案例分析

目录 01 第一章 1.1 GIS空间分析的概念 1.2 GIS空间分析的研究对象、研究目标 1.3 研究目标是:认知、解释、预报、调控。 1.4 道路拓宽案例分析 1.5 GIS空间分析的核心问题 02 第二章 2.1 空间查询的概念、空间量算的概念 2.2 函数距离的概念 2.3 空间查询…

Android之 常用数据库框架整理

一 简介 1.1 上节说了关系型数据库有以下几种: Oracle、Microsoft SQL Server、Microsoft Access、MySQL、SQLite 1.2 各自的领域也不一样 java,C#,php等用Oracle,Microsoft SQL Server,MySQL比较多。 移动端Andr…

07 - 3系统容量规划

阿里系业务容量规划 Tair集群部署与水位调配 阿里系容量精调之单机压测场景 传统模拟请求 流量复制 流量转发 网关权重 线上测试注意点 阿里系混合部署技术 资源分时复用:提高资源利用率sigama框架做在线资源池调度,伏羲做离线资源池调度;…

基于fpga的图像处理之图像灰度化处理(Vivado+Modelsim+Matlab联合仿真验证)

** 基于fpga的图像处理之图像灰度化处理 ** 本文的思路框架: ①本文采用两种算法进行灰度处理,平均法和加权均值法;加权均值法采用了直接公式求解和查找表两种方式验证 ②FPGA设计中三个设计技巧,可用于工程项目借鉴&#xff…

Redis了解

Redis 源码大概做了哪些事情? 设置默认参数创建对象、持久化定时器回调加载文件参数 (使用配置文件替代部分默认参数)加载文件数据写入字典创建client connect事件handler(accept后,写入读写事件select(),最新的版本用epoll&…

xlsx 导出 (简单使用)

下载数据为xlsx 安装 npm install xlsx 在src下创建文件utils文件夹,在utils文件夹下创建XLSX.js文件 // 下载excel功能 import * as XLSX from xlsx/*** param dataList 表格数据内容 array* param fileName 文件标题。必须以 .xlsx结尾*/ export const download…

Linux网络——Shell编程之快捷命令

Linux网络——Shell编程之快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令六、文件合并 —paste 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位…

五步看平台,选好安全的MT4交易外汇平台

在选择MT4外汇交易平台时,如何避免不正规的平台?以下是5招教你远离不正规MT4交易外汇平台。 1. 查看平台是否取得合法许可证 首要考虑的是该平台是否取得了合法的许可证。许可证是证明一个交易平台合法的最重要证据,因此务必在选择时核查该平台的许可证…

得物深入浅出解析JVM中的Safepoint

1.初识Safepoint-GC中的Safepoint 最早接触JVM中的安全点概念是在读《深入理解Java虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样,都是通过这样的方式第一次对安全点有了初步认识。不妨,先复习一下《深入理解Java虚拟机》书中安全点那一章…

你真的了解Java类加载机制吗?

大家好,我是小米,一个喜欢分享技术的程序员。今天我来给大家简述一下Java类加载模型。 在Java中,类的加载过程是在程序运行时动态进行的。Java的类加载模型可以分为三个步骤:加载、连接和初始化。 类加载过程:加载 首…

Android面试指南:谈谈你对Flutter的理解

一、Flutter简介 Flutter是由Google开发的一种基于Dar编程语言的移动应用开发框架。可以帮助开发在构建高性能、美观、灵活的应用程序,从而实现跨平台开发,适用于与Android、ios、web、windows、macOS和linux等多个平台。 二、学习Flutter有什么优势 …

Java EE企业级应用开发(SSM)第11章

第11章SSM框架 一.预习笔记 1.准备jar包(注意版本) Spring一套包 Springmvc两个 Mybatis一个 Spring整合mybatis一个 Jstl一个用于jsp显示数据 Mysql一个用于访问数据库 Gson一个用于返回json数据 2.准备配置文件web.xml applicationContext.xml…

MySQL Client

MySQL客户端很多,自身携带的一些客户端工具也需要了解,方便快速测试。 MySQL Shell MySQL Shell Commands。 执行SQL语句时,必须切换到SQL模式。Shell指令较少,同时可以使用Python \py模式。 MySQL Shell所有的命令后面不需要加…

TCP通道和共享链路通道

推送SDK为了适应不同的场景和需求,对于一些对消息及时性、可靠性、自定义性要求高的应用,如即时通讯、社交、游戏等,可能更倾向于使用TCP通道,对于一些对消息节省流量、耗电量、兼容性要求高的应用,如新闻、天气、股票…

【软件工程】自动化测试保证卓越软件工程能力(3)

测试目标定义 对照目标系统,如下: 给出自动化测试平台目标如下: Case levelCase briefReport send toOVERALLUser 1 -> Process -> Customer 1BossLevel 1User 1 -> Process -> Customer 1 User 1 -> Process -> Custome…

AI自动写文章工具-ai文章智能生成器

随着人工智能技术的快速发展,越来越多的应用开始使用AI自动生成文章的功能,实现全自动、高质量和高效率的文章写作。本文将从全自动批量生成、没有错别字和标准语法、自动插入图片以及严格按照标准格式结构生成几个方面,展开对AI自动生成文章…

数据分析04——Pandas简介/Series对象/DataFrame对象

1、Pandas简介: Pandas是基于NumPy开发的数据分析三大剑客之一,Python数据分析的核心库提供快速、灵活、明确的数据结构Series对象:一维数组结构,由index和value构成DataFrame对象:二维数组结构,由index、…

MySQL基础(二十五)InnoDB数据存储结构

1 数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作…

在外Windows公网远程连接MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…

友元函数,友元类,内部类及其之间的关系,匿名对象等

TIPS 当某一个类当中有自定义类型成员变量的时候,然后对该类的实例化对象调用函数的时候走初始化列表的时候,如果说要对自定义类型成员变量进行初始化列表初始化的时候,尽管那个自定义类型它的构造函数是没有参数的,但是此时括号…