`
bugyun
  • 浏览: 557104 次
社区版块
存档分类
最新评论

Java BIO\NIO\AIO,同步\异步\阻塞\非阻塞介绍

    博客分类:
  • Java
 
阅读更多

 

参考:http://blog.csdn.net/skiof007/article/details/52873421

 

同步阻塞IO:在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

 

同步非阻塞IO:在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

 

异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

 

 异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。   

 

以银行取款为例: 

同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写);

异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API);

阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);

非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)

      

 

BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。

 

NIO: 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂

 

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。

      

分享到:
评论

相关推荐

    java BIO NIO AIO

    Java BIO( Blocking I/O)是一种同步阻塞式的 I/O 模式,即服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。如果这个连接不做任何事情会造成不必要的线程开销。这种...

    基于java的BIO、NIO、AIO通讯模型代码实现

    Java作为一门广泛使用的开发语言,提供了多种I/O(Input/Output)通信模型,包括传统的阻塞I/O(BIO)、非阻塞I/O(NIO)以及异步I/O(AIO)。这些通信模型在不同的场景下有着各自的优势,理解和掌握它们对于优化...

    bio nio aio demo

    为了处理与外部世界的交互,Java提供了三种不同的I/O模型:BIO( Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)。这些模型各有优缺点,适用于不同场景。下面我们将深入探讨这三种I/O模型,并...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    BIO(Blocking I/O)是一种同步阻塞式 I/O 模式,服务器需要为每个客户端分配一个独立的线程来处理请求,导致服务器资源浪费。 NIO(Non-Blocking I/O)是一种异步非阻塞式 I/O 模式,服务器使用单个线程来处理多个...

    BIO,NIO,AIO,Netty面试题.pdf

    ### BIO、NIO、AIO、Netty 面试题解析 #### 1. Java IO 基础概述 Java中的I/O操作是通过流(Stream)来实现的,所有的数据都通过流的方式被串行化处理。串行化的含义在于数据必须按顺序输入输出。Java中的IO操作...

    Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

    最后,理解IO模型,包括同步阻塞、同步非阻塞、异步阻塞和异步非阻塞,有助于优化系统的并发性能。在Java中,这五种模型分别对应BIO、NIO、AIO、传统的异步I/O(如Java的Future)以及基于回调的异步I/O。这些模型的...

    BIO,NIO,AIO实现的demo

    NIO(非阻塞I/O)是在Java 1.4版本引入的,它提供了一种更有效率的处理I/O的方式。NIO的核心概念是通道(Channel)和缓冲区(Buffer)。在NIO中,读写操作都是非阻塞的,即当数据没有准备好时,调用read或write方法...

    2024年Java常见的-BIO,NIO,AIO,Netty面试题

    - **定义**:AIO是一种异步非阻塞的I/O模型,它进一步优化了NIO,使得I/O操作可以完全异步地完成。当客户端发起I/O请求时,由操作系统负责完成I/O操作并将结果返回给应用程序。 - **应用场景**:适用于连接数多且...

    BIO、NIO、AIO、Netty 、TCP全网最全解析!Netty中提供了哪些线程模型?

    2. **NIO(非阻塞I/O)**:Java 1.4引入了NIO,它允许在等待数据时不再阻塞线程,而是返回一个状态,让线程可以去做其他事情。NIO通过选择器(Selector)实现,一个线程可以管理多个通道(Channel),提高了系统的...

    SocketIO-BIO-NIO-AIO.zip

    BIO是Java中最传统的I/O模型,基于流式操作,数据读写都是同步阻塞的。当一个线程负责处理客户端连接时,如果该线程在读写数据过程中被阻塞,那么这个线程将无法处理其他客户端的请求。因此,当并发量较大时,BIO...

    Java通讯模型-BIO、NIO、AIO综合演练

    1. **概念**:AIO(也称为NIO 2)是Java 7引入的,进一步优化了非阻塞I/O,提供了异步读写能力,用户可以注册事件监听,当数据准备好时,系统会通知用户进行处理。 2. **优点**:真正实现了异步,避免了线程阻塞,...

    网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    Java NIO(非阻塞I/O)库提供了异步I/O的支持,通过`AsynchronousSocketChannel`和`AsynchronousServerSocketChannel`等类实现。 2. 阻塞IO与非阻塞IO: - **阻塞IO**:在阻塞模式下,当请求数据未准备好时,系统...

    java nio 异步编程源码

    Java NIO(非阻塞I/O)和AIO(异步I/O)是Java平台中用于提高I/O性能的重要技术。在传统的Java BIO(阻塞I/O)模型中,一个线程对应一个连接,当服务器处理大量并发连接时,线程资源消耗大,效率较低。而NIO和AIO则...

    BIO,NIO,AIO,Netty面试题 35道1

    AIO,又称NIO 2,是Java 1.7引入的异步非阻塞I/O模型。在AIO中,I/O操作由操作系统在后台完成,当操作完成时,操作系统会通知应用程序。这样,服务器只需要为有效请求创建线程,提高了资源利用率,适合处理少量长...

    浅谈Java中BIO、NIO和AIO的区别和应用场景

    Java中BIO、NIO和AIO的区别和应用场景 Java中IO模型有三种:BIO...BIO是古老的同步阻塞IO模型,NIO是同步非阻塞IO模型,AIO是真正意义上的异步非阻塞IO模型。选择合适的IO模型可以极大地提高服务器的性能和可扩展性。

    一文彻底理解Java中IO的BIO、NIO、AIO

    在Java的发展历程中,IO模型经历了三个主要阶段:BIO(Blocking IO)、NIO(Non-blocking IO)和AIO(Asynchronous IO),这三种模型各自有其特性和适用场景,下面将详细解析它们的工作原理和区别。 **1. BIO(阻塞...

    Java中BIO、NIO、AIO的理解

    "Java中BIO、NIO、AIO的理解" Java中BIO、NIO、AIO的理解是Java高性能IO体系...Java中BIO、NIO、AIO是三个不同的IO模型,它们之间的区别在于同步和异步,阻塞和非阻塞。理解这些概念对于设计高性能的IO体系非常重要。

    BIO、NIO、AIO

    NIO,非阻塞I/O,从Java 1.4版本开始引入,位于`java.nio`包中。NIO的核心概念包括通道(Channels)和缓冲区(Buffers)。在NIO中,线程不会因等待数据而被阻塞,而是可以继续处理其他任务,当数据准备好时,操作...

    01-VIP-BIO,NIO,AIO精讲1

    首先,我们来看BIO,即同步阻塞IO模型。在BIO中,每个客户端连接都会分配一个单独的线程进行处理,这意味着如果有很多连接,服务器会创建大量线程,可能导致资源过度消耗。例如,服务端代码中的`ServerSocket.accept...

Global site tag (gtag.js) - Google Analytics