• 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难度简单简单非常复杂复杂
    调试难度简单简单复杂复杂
    可靠性非常差
    吞吐量
  • 相关阅读:
    通过JDBC连接MySQL
    动态规划(Dynamic Programming)与贪心算法(Greedy Algorithms)
    【React-Hooks基础】入门级详解——useState / useEffect /自定义hook
    线程池与CompletableFuture
    Nacos--服务搭建以及SpringBoot整合--方法/实例
    大数据面试重点之kafka(六)
    第三章---堆栈队列 板子
    设计模式学习
    解决使用npm出现Cannot find module ‘XXXnode_modulesnpmbinnpm-cli.js‘错误
    Jmeter面试题
  • 原文地址:https://blog.csdn.net/qq1049545450/article/details/127808356