NIO AIO BIO及 IO多路复用概述

IO读写的基础原理 ⛽️

作为一名JAVA开发人员,IO原理和知识是我们需要掌握的基础原理,也是通向大公司面试的必备知识。
用户进程在进行IO的读写操作时,是依赖于底层的IO读写的,通过read和write两大系统调用。
这里需要注意:

  • 1、read系统调用并不是直接将数据从物理设备读取到内存中;而是将内核缓冲区的数据复制到进程缓冲区。
  • 2、write系统调用也不是将数据从内存中写出到物理设备;而是将数据从进程缓冲区写出到用户缓冲区中。
  • 3、上层应用都只是将缓存区中的数据进行复制,而真正与磁盘进行数据交换是由操作系统内核(Kernel)来完成的。

进程缓冲区与内核缓冲区 🚀

一听到缓冲区,对于开发人员来说,首先想到的就是缓冲部分数据,在进行数据复制和写出的过程中无需反复发送,提高效率。那么在操作系统层面缓存区的作用是什么呢?
答:缓存区的目的,是为了减少频繁与物理设备之间进行数据的交换。
区别
在Linux系统中,从数量上讲,操作系统内核只有一个内核缓冲区、但是每一个用户程序(进程),都有自己独立的缓冲区,叫做进程缓冲区。所以在大多数情况下,并没有实际的做IO操作,只是将进程缓冲区与内核缓冲区之间进行数据的交换。

系统调用流程 🐶

在这里插入图片描述
如上图体现了一次read系统调用的过程,整体流程大体上可以分成两个部分:

  • 1、等待内核数据准备好。
  • 2、将数据从内核缓冲区复制到进程缓冲区。

举个🌰
如果上述操作是JAVA服务器端,完成一次Socket请求和响应,那么整体流程如下:

  1. 客户端请求:Linux服务端通过网卡读取请求数据,并将结果写入到内核缓冲区。
  2. 获取请求数据:Java服务器通过read系统调用,将内核缓冲区的数据复制到用户进程缓冲区。
  3. 服务端程序业务处理:Java服务端在自己的空间中,对数据进行处理。
  4. 服务端返回数据:Java服务端在对数据进行处理后,通过write系统调用,将用户进程缓冲区的数据复制到Linux内核缓冲区。
  5. 返回数据到客户端:Linux内核通过网络IO将数据写会到网卡,网卡再通过相关的协议,将数据写回到客户端,完成了一次的请求。

同步与异步😊

相信很多人都听过:同步阻塞IO、同步非阻塞IO、异步非阻塞IO,那么同步与异步有什么区别呢?
下面引用Netty、Redis、Zookeeper高并发实战一本书中的解释:

同步IO是指用户空间的线程主动发起请求的一方,内核空间是被动接受方;异步IO则相反。

通过上面的这句话是否已经理解了同步与异步的区别了呢?
这里我的理解是:只考虑最后内核空间的处理结果数据的获取,前面可能会有各种的请求与回复,都不做考虑;在最后一次数据的获取时,如果需要用户线程主动发起获取数据的请求,内核空间才会将将数据返回,这种方式就是同步;如果最后一次数据获取时,无需用户进程向内核空间发获取数据的请求,内核空间就可以主动将数据发送给用户进程,这种方式就是异步。

阻塞与非阻塞✈️

弄明白上面的阻塞与非阻塞,那么阻塞与非阻塞就很简单了。

  1. 阻塞IO是指,用户进程在向内核空间获取数据的时候,需要等待内核IO操作彻底完成后才返回到用户空间执行用户的操作,这期间用户空间是阻塞的,只能等待。
  2. 非阻塞IO是指,用户进程向内核空间获取数据的时候,会立刻返回给用户一个状态值,是否获取数据成功;用户程序需要不断轮训获取数据。

终于到 NIO AIO BIO 了 🚢

无论在面试中还是在实际开发中,JAVA NIO BIO AIO以及IO多路复用都是很常见的,也是很重要的。

BIO 同步阻塞IO

在这里插入图片描述

如上图,JAVA程序从IO系统调用开始、直到系统调用返回,这段时间JAVA进程是阻塞的,直到返回成功后,应用进程才开始处理用户空间缓冲区的数据。

BIO的缺点

  1. 用户进程等待IO的两个阶段都阻塞了。
  2. 一般情况下会为每一个连接分配一个独立的线程,就是一个线程维护一个IO连接,在并发量较小的情况下可以使用,在高并发的场景下,不可用。
  3. 需要大量的线程来维护IO连接,资源耗费大,同时线程切换花销大,阻塞IO在高并发场景下不能用。

NIO 同步非阻塞IO

在这里插入图片描述
如上图,在内核缓冲区没有数据的情况下,系统调用会立刻返回,返回一个调用失败的信息;在内核缓冲区有数据的情况下,是阻塞的,直到数据从内核缓冲区复制到用户进程缓冲区。复制完成后,系统调用返回成功,应用程序开始处理缓存数据。
优点
每次应用程序线程发起请求后,在内核等待数据的过程中,立刻返回,用户线程无需阻塞,实时性好。
缺点
应用程序线程需要不断轮询获取数据信息,占用大量CPU资源,效率低下。

AIO 异步非阻塞IO

在这里插入图片描述
在异步IO的模型中,在整个内核处理的过程中,包括内核将数据从物理设备读取到内核缓冲区以及将数据从内核缓冲区复制到进程缓冲区,都是非阻塞的。
缺点
用户程序注册事件给操作系统,其余事情将由操作系统完成,也就是说操作系统必须要提供支持。
对于大多数的高并发服务端程序来说,一般是基于Linux系统的,因而:目前这类该并发应用程序开发,大多数采用IO多路复用。

IO多路复用

在这里插入图片描述
IO多路复用模型引入了一种IO就绪状态查询的系统调用select/epoll,通过该系统调用,一个进程可以监视多个文件描述符,一但某一个描述符就绪,内核能够将就绪状态返回给应用程序,随后应用程序根据就绪状态进行相应的IO系统调用。
在IO多路复用模型中,需要底层操作系统对select/epoll的支持。在Netty中也是使用IO多路复用实现的。
优点
与一个线程维护一个IO连接的方式相比,IO多路复用模型使用select/epoll最大的好处在于,一个选择器可以同时监控千万个连接,系统不必创建大量的线程,也不必维护这些线程,减少了系统不必要的开销。
想要彻底的解除线程的阻塞,就必须使用异步IO

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java的虚拟线程是指在Java程序使用的线程,它是运行在操作系统的内核线程之上的一层抽象。虚拟线程主要用于线程调度和线程池实现,可以有效地管理系统资源并避免线程频繁创建和销毁带来的开销。 IO多路复用是指程序可以同时监听多个网络套接字的输入输出事件,当某个事件发生时能够及时地做出响应。它可以使用多个线程或者单个线程实现,可以大大提升程序的吞吐量和效率。 ### 回答2: Java的虚拟线程是指在Java使用的一种线程模型,称为"弹性线程池"。传统的线程模型,每个线程都需要占用一个操作系统的线程资源,当需要创建大量的线程时,会耗费大量的内存和线程切换开销。而虚拟线程可以通过使用少量的线程,动态地处理多个任务。虚拟线程采用了协程的概念,可以在一个线程动态开启和暂停多个任务,从而提高了并发性能。 而IO多路复用是一种IO模型,可以在一个线程同时监听多个IO事件。在传统的阻塞IO模型,每个客户端连接都需要一个线程来处理,当连接数增加时,线程数量也会相应增加,导致系统资源浪费。而IO多路复用通过一个线程管理多个IO事件,并且只在有事件发生时才会进行处理,大大提高了系统的并发能力。 JavaIO多路复用主要通过选择器(Selector)来实现,它可以监控多个通道的IO事件,并在事件发生时通知线程进行处理。在利用选择器进行IO多路复用时,可以使用非阻塞IO来处理连接,即一个线程可以同时处理多个连接,提高了系统的吞吐量和响应速度。 虚拟线程和IO多路复用在Java都是为了提高系统的并发性能和资源利用率。虚拟线程通过动态的任务调度和协程的概念,实现了在少量线程上同时执行多个任务的能力。IO多路复用则通过一个线程同时监听多个IO事件的方式,减少了线程切换和系统资源的开销。这两个技术的结合可以进一步提高Java程序的并发处理能力,并优化系统的性能表现。 ### 回答3: Java的虚拟线程是指Java虚拟机(JVM)在操作系统的线程之上提供的一种更高级别的并发性抽象。它将操作系统线程映射到Java线程,并通过使用线程池技术来管理线程的生命周期。虚拟线程可以更有效地使用操作系统线程资源,减少线程的创建和销毁开销,并提供更高的并发性能。它还提供了一些高级并发特性,例如线程池的线程重用、线程的优先级管理和线程间的协作等。通过使用虚拟线程,开发人员可以更方便地编写高并发的Java程序,同时充分利用操作系统的硬件并发性。 IO多路复用是一种利用操作系统提供的非阻塞IO机制来同时监听多个IO通道的技术。它通过将多个IO通道注册到一个选择器对象(Selector)上,并在有IO事件发生时,使用单个线程来处理所有已注册的IO通道。这种方式可以大大减少线程的创建和销毁开销。在Java,通过使用NIO(New IO)的特性,可以方便地实现IO多路复用。Java的Selector类提供了对多路复用的支持,可以同时监听多个通道的IO事件,并通过“就绪集合”来获取已发生的事件。开发人员可以使用Selector来监测多个通道的IO状态,并根据不同的事件类型来执行相应的处理逻辑。 总之,Java的虚拟线程和IO多路复用都是为了提高Java程序的并发性能和资源利用效率。虚拟线程将操作系统线程映射到Java线程,并提供更高级别的并发性抽象,可以更高效地管理线程资源。而IO多路复用则利用非阻塞IO和选择器来同时监听多个IO通道的IO事件,减少线程开销,提高IO处理性能。这些技术在Java程序的应用可以帮助开发人员更好地处理高并发和大量IO操作的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值