JavaIO流中的BIO、NIO、AIO的区别和对比

  • NIO是java1.4版本引入的一种IO模型,他是同步, 他是同步非阻塞的, 有三个核心区channel管道, buffer缓冲区, 还有selecter选择器监视区

  • NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。

  • 当我们发送一个读取请求的时候会通过通道来发送, 到我们的缓冲区去寻找数据, 找到多少数据就拿多少数据, 如果没有找到数据我们也不会对其进行阻塞的处理,而是在选择器监视区中找其他的io, 切换到可以执行的io在这里插入图片描述

  • NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面(选择监视器),所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

  • BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。

  • 这样就大大提高了io的效率, 他和BIO根本区别就是BIO是面向流操作, 而NIO是有自己的缓冲区和选择器监视区, 可以对有效的io进行操作

AIO


  • AIO是NIO的升级版, 是java1,7版本推出的异步非阻塞的io模型, 它基于事件的回调来完成的, 他和NIO最大的区别是NIO是主动在个个线程中进行更换, 而AIO是被动形式的, 基于事件的回调, 如果数据准备好之后操作系统会通知我们的AIO模型中的线程去读取,这样就不会出现空IO的情况

  • 详细说的话就是:当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。

  • 在InnoDB中也是用到了异步IO, 利用其异步的优势, 可以对其进行merge操作, 比如当多个IO请求, 访问的是(6, 8), (7, 8), (8,8)这几个页, 使用同步IO的话会有三次IO请求, 而使用异步IO的话, 可以对其进行合并, 只发送一个IO请求, 访问(6, 8) 即可, 并且InnoDB中的优化策略刷新临近页也是这样使用的异步IO的merge思想

信号驱动IO


  • 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号后,便在信号函数中调用IO读写操作来进行实际的IO请求操作

在这里插入图片描述

总结


BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0
j2K-1725644503513)]

加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值