内核aio_理解 Java 三种IO模型 BIO/ NIO/ AIO,面试必考问题!

news/2024/7/4 7:16:24
↑ 点击上面 “时代Java”关注我们, 关注新技术,学习新知识!

Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。
在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。
关于同步和异步的概念解读困扰着很多程序员,大部分的解读都会带有自己的一点偏见。参考了 Stackoverflow相关问题后对原有答案进行了进一步完善:
When you execute something synchronously, you wait for it to finish before moving on to another task. When you execute something asynchronously, you can move on to another task before it finishes.
当你同步执行某项任务时,你需要等待其完成才能继续执行其他任务。当你异步执行某些操作时,你可以在完成另一个任务之前继续进行。同步:两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行。比如在A->B事件模型中,你需要先完成 A 才能执行B。再换句话说,同步调用中被调用者未处理完请求之前,调用不返回,调用者会一直等待结果的返回。异步:两个异步的任务完全独立的,一方的执行不需要等待另外一方的执行。再换句话说,异步调用种一调用就返回结果不需要等待结果返回,当结果返回的时候通过回调函数或者其他方式拿着结果再做相关事情,阻塞和非阻塞阻塞:阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。非阻塞:非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

如何区分 “同步/异步 ”和 “阻塞/非阻塞” 呢?
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。

1  BIO(Blocking IO)

BIO是同步阻塞模型,一个客户端连接对应一个处理线程。在BIO中,accept和read方法都是阻塞操作,如果没有连接请求,accept方法阻塞;如果无数据可读取,read方法阻塞。

3def9225cfc7bb357f7b99a346b95e99.png

2  NIO(Non Blocking IO)

NIO是同步非阻塞模型,服务端的一个线程可以处理多个请求,客户端发送的连接请求注册在多路复用器Selector上,服务端线程通过轮询多路复用器查看是否有IO请求,有则进行处理。

8f4b822d7105012437e1b90e92809710.png

NIO的三大核心组件:

Buffer:用于存储数据,底层基于数组实现,针对8种基本类型提供了对应的缓冲区类。

Channel:用于进行数据传输,面向缓冲区进行操作,支持双向传输,数据可以从Channel读取到Buffer中,也可以从Buffer写到Channel中。

Selector:选择器,当向一个Selector中注册Channel后,Selector 内部的机制就可以自动不断地查询(Select)这些注册的Channel是否有已就绪的 I/O 事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个Channel,也可以说管理多个网络连接,因此,Selector也被称为多路复用器。当某个Channel上面发生了读或者写事件,这个Channel就处于就绪状态,会被Selector监听到,然后通过SelectionKeys可以获取就绪Channel的集合,进行后续的I/O操作。

bf765dc9c3ee3428f44717e3b57663b3.png

Epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

3  AIO(NIO 2.0)

AIO是异步非阻塞模型,一般用于连接数较多且连接时间较长的应用,在读写事件完成后由回调服务去通知程序启动线程进行处理。与NIO不同,当进行读写操作时,只需直接调用read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。

对比

同步阻塞IOBIONIOAIO
客户端数目IO线程1 : 1m : nm : 1m : 0
IO模型同步阻塞IO同步阻塞IO同步非阻塞IO异步非阻塞IO
吞吐量
编程复杂度简单简单非常复杂复杂

--

知识分享,时代前行!

~~ 时代Java

还有更多好文章……

请查看历史文章和官网,

↓有分享,有收获~


http://www.niftyadmin.cn/n/612065.html

相关文章

90土壤分类中英文_彩虹之花——鸢尾的园艺分类及应用

引言:古希腊语中“鸢尾”一词意为彩虹,与美丽的自然现象相比,鸢尾花朵的色彩则更加丰富。鸢尾因花美丽和香气独特而受赞赏,鸢尾根提取物可用于香水,葡萄酒,伏特加酒和糖果的生产。全世界鸢尾的种类超过六万…

公众号滑动图代码_微信公众号图文中的图片如何实现上下左右的滑动效果?

大家先看图,这是一张滑动效果的图片,这个样式放到微信图文里面,可以上下滑动,也可以左右滑动。(左右滑动样式)(上下滑动样式)我们在做微信排版的时候,可以用到这个样式,不仅好看而且能节省很多空间&#xf…

win10自带抓包工具_别再找了,Win 10中自带8种免费截图工具,简单好用不花钱

以前我们截图都是使用第三方工具,使用方便,易操作,特别是可截取的部分灵活多样,给我们带来了很大的方便,但是,这些第三方工具很多都是要收费的,对于囊中羞涩的用户来说,会带来很大的…

python怎么合并两个图标_python – 将两个现有图合并为一个图

这是一个完整的最小工作示例,它完成了提取和组合多个图中数据所需的所有步骤.import numpy as npimport pylab as plt# Create some test datasecret_data_X1 np.linspace(0,1,100)secret_data_Y1 secret_data_X1**2secret_data_X2 np.linspace(1,2,100)secret_data_Y2 sec…

ali arthas 火焰图_使用arthas 生成火焰图分析jvm

arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问入口环境准备docker-compose 文件version: "3"services:web:image: openrest…

一个遮罩层怎么遮罩两个图层_PPT动画特效制作案例:遮罩动画,你看不到我!...

前段时间,写了一些动画特效制作,其中有个遮罩动画,大家都觉得很不错!可能,没有看过我文章的朋友,还在想:遮罩动画是什么鬼?看个例子你就知道了,类似于TED演讲的开头或者钢…

只有1kb的清理软件_1kb病毒专杀工具下载

1KB文件夹快捷方式病毒清除工具是一款专门为清理那些1kb文件类型的病毒而推出的电脑杀毒工具,帮助用户快速寻找系统中的隐藏病毒文件,极大程度上消除了病毒隐患,喜欢就试试吧!软件介绍:1KB文件夹快捷方式病毒清除工具&…

SQL note

structured query language综合的、通用的、功能极强的关系数据库语言包括数据定义(DDL)-create、数据操纵(DML)-insert、delete、update、select数据控制-grant是单进程多线程的关系性数据库sql特点:1、一体化的语言,2、统一的语法结构、多种使用方式,3、高度非过程…