您的位置:首页 > 大数据 > 人工智能

NIO、BIO、AIO、同步异步、阻塞非阻塞傻傻分不清楚?

2021-01-02 16:53 1216 查看

目录
  • 同步与异步
  • NIO与BIO的区别总结
  • AIO是啥?
  • 总结
  • 参考阅读
  • 以下内容摘自:敖丙肝了一个月的Netty知识点

    阻塞与非阻塞

    阻塞和非阻塞操作是针对发起的IO请求操作后是否立刻返回一个标志信息而不让请求线程等待,当数据准备未完成时,请求线程的状态:

    阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。

    非阻塞:无论数据是否准备好,都会直接返回。

    阻塞IO

    非阻塞IO

    同步与异步

    同步与异步是基于应用程序和操作系统处理IO事件所采用的方式:

    同步:应用程序要直接参与IO读写的操作。

    异步:所有的IO操作交给操作系统去处理,应用程序只需要等待通知。

    异步相比较于同步带来的直接好处就是在我们处理IO数据的时候,异步的方式我们可以把这部分等待所消耗的资源用于处理其他事务,提升我们服务自身的性能。

    同步IO

    异步IO

    NIO与BIO的区别总结

    NIO BIO
    基于缓冲区( Buffer ) 基于流( Stream )
    非阻塞 IO 阻塞 IO
    选择器( Selector )

    BIO

    Blocking IO,是同步阻塞的IO模型,传统的IO【java.io包】就是这种模型。

    BIO面向字节流或字符流,以流的方式顺序地处理一个或多个字节。

    BIO的IO操作是阻塞式的:当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

    采用BIO形式的网络通信,服务器端启动一个ServerSocket,客户端需要启动Socket来进行一对一连接,如果客户端有多个客户端请求,当其中一个客户端线程连接成功后,其他的将会阻塞。如果需要实现服务端同时处理多个客户端线程,必然需要服务器端开启多线程与之对应,这样就会导致如果客户端请求过多,服务器线程开辟过多导致系统崩溃。

    NIO

    NIO是Java1.4引入的,相对于传统的IO来说,N可以代表New的意思,表示新IO,但更为具体的理解是Non-blocking的意思,是一种同步非阻塞的IO模型。它提供了Buffer,Channel,Selector三大组件。

    1044 同步与非阻塞怎么理解,是否矛盾?

    非阻塞体现在:用户程序发起IO操作请求后不等待数据,而是调用会立即返回一个标志信息告知条件不满足,数据未准备好,用户请求程序继续执行其他任务。执行完其他任务,用户程序会主动轮询查看IO操作条件是否满足,如果满足,则用户程序亲自参与拷贝数据动作,这是同步的过程。

    NIO支持面向Buffer,基于Channel的IO操作,任何数据在Buffer中进行处理,且能够任意改变操作位置,处理灵活。

    NIO的IO操作可以是非阻塞的:当一个线程执行从Channel读取数据的IO操作时,如果有数据,则返回数据;如果没数据,不需要阻塞,而是可以直接返回。

    NIO实现非阻塞IO的其中关键组件之一就是Selector,可以注册多个Channel到一个Selector中。Selector可以不断执行select操作,判断这些注册的Channel是否有已就绪的IO事件,如可读,可写,网络连接已完成等。一个线程通过使用一个Selector管理多个Channel。

    NIO就是一个线程负责所有请求连接但不处理IO操作,该线程只负责把连接注册到多路复用器上,多用复用器轮询到连接有IO请求时候再启动其它线程处理IO请求操作,实现一个线程或少量线程就可以对应众多的客户端线程。

    AIO是啥?

    JDK1.7中,

    java.nio.channels
    包下增加了多个异步通道,是NIO的升级版本,实现AIO AsynchronousIO的异步非阻塞IO模型。

    非阻塞前面已经解释过了,异步指的就是数据拷贝阶段完全由操作系统处理,而应用程序只需要等待通知即可。

    总结

    • 同步与异步的区别在于数据拷贝阶段是否需要完全由操作系统处理。
    • 阻塞和非阻塞操作是针对发起的IO请求操作后是否立刻返回一个标志信息而不让请求线程等待。
    • BIO是同步阻塞式的IO模型,面向流操作,保证顺序,如JDK1.4之前的传统IO操作。
    • NIO是同步非阻塞式的IO模型,面向缓冲区,提供Channel,Buffer,Selector等抽象,如JDK1.4引入的IO操作。
    • AIO是异步非阻塞式的IO模型,如JDK1.7引入的IO操作。

    参考阅读

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐