• Netty之I/O模型比对


    传统的IO(BIO)

    在这里插入图片描述
    由一个独立的Acceptor线程负责监听客户端连接,接收到连接请求后,为每个客户端创建一个新的线程进行链路处理,处理完后通过输出流返回给客户端,然后销毁线程。
    传统BIO的最大问题就是,每个连接都需要创建新的线程来处理,这种模型显然无法满足高性能、高并发的场景。

    伪异步IO

    在这里插入图片描述
    将客户端的socket封装成Task,放到任务队列中,通过线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。提高了并发能力。但是并没有解决阻塞的问题。

    新的IO(NIO)

    缓冲区Buffer

    • 传统IO是面向流的,可以将数据直接写入或将数据直接读到Stream对象中。
    • NIO中,所有的数据都是用缓冲区处理的,在读取数据时,它是直接读到缓冲区的。在写入数据时,也是直接写入到缓冲区的。任何时候访问NIO中的数据,都是通过缓冲区进行操作。

    缓冲区实质上是一个数组,每种Java基本类型除了Boolean外,都对应一种缓冲区:
    在这里插入图片描述

    通道Channel

    • 通道与流的不同之处是通道是双向的,流只能是一个方向上移动的(InputStream或OutStream),通道可以用于读、写或者读写同时进行。
      在这里插入图片描述

    多路复用器Selector

    • Selector会不断地轮询注册在其上的Channer,如果某个Channel上发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,然后进行后续的IO操作。
    • 在这里插入图片描述
    1. 打开ServerSocketChannel,用于监听客户端连接:
    ServerSocketChannel acceptorSvr = ServerSocketChannel.open();
    
    • 1
    1. 绑定监听端口,设置连接为非阻塞模式
    
    
    • 1

    在这里插入图片描述

    AIO(异步NIO/异步非阻塞IO)编程

    NIO 2.0引入新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。
    异步通道提供以下两种方式获取操作结果:

    • 通过java.util.concurrent.Future类来标识异步操作的结果。
    • 在执行异步操作时传入一个java.nio.channels。

    CompletionHandel接口的实现类作为操作完成的回调。

    几种IO模型的功能和特性比对:

    特性同步阻塞IO(BIO)伪异步IO非阻塞IO(NIO)异步IO(AIO)
    客户端个数:IO线程数1:1M:N(M可大于N)M:1(1个IO线程处理多个客户端连接)M:0(不需要启动额外的IO线程,被动回调)
    IO类型(阻塞)阻塞IO阻塞IO非阻塞IO非阻塞IO
    IO类型(同步)同步IO同步IO同步IO(IO多路复用)异步IO
    API难度简单简单非常复杂复杂
    调试难度简单简单复杂复杂
    可靠性非常差
    吞吐量
  • 相关阅读:
    优化elementUI的Message消息提示连续触发,满屏显示问题
    玄子Share-MultipartFileUtil-文件上传工具类,单文件,多文件,指定大小,指定后缀
    刷穿力扣(1~30)
    flinkCDC数据同步之 postgresql to starrocks
    深度解读 AEC-Q100 Rev-J:为什么先进制程芯片的 ESD 电压降低?车规标准“放水”了?
    .Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
    【毕业设计】基于php+mysql+apache的subversion用户管理系统设计与实现(毕业论文+程序源码)——用户管理系统
    Ubuntu 16.04升级OpenSSH
    Docker容器
    一道面试题:JVM老年代空间担保机制
  • 原文地址:https://blog.csdn.net/qq1049545450/article/details/127808356