Netty 学习之路(一) NIO介绍

NIO介绍

Netty 是基于 Java NIO进行二次开发的高性能网络框架, 在介绍Netty之前, 先介绍 NIO 相关的东西.


OIO,NIO,AIO

  • OIO又叫 BIO (Blocking IO)

    同步阻塞的IO, 获取不到资源的时候, 会阻塞当前线程, IO操作的时候会阻塞直至IO操作完毕返回结果(同步IO). 每一个客户端连接都需要单独开辟一个线程来进行处理,连接数多的时候,线程数也随之上升, CPU 切换线程频繁, 实际处理业务操作的时间最终可能还没有切换线程的时间长, 线程多的时候, CPU资源利用率极低

  • NIO , new-IO 或者 non-blocking IO (JDK1.4开始支持)

    同步非阻塞IO, OIO的升级版, 获取不到资源的时候, 不会阻塞当前线程, 同步IO. NIO一个线程可以处理多个通道(连接), 线程数量往往不会很多, CPU资源利用率高.

  • AIO, Asynchronous IO (JDK1.7开始支持)

    异步非阻塞, NIO 的升级版, 获取不到资源不会阻塞当前线程(非阻塞),IO操作也不会阻塞当前线程(异步IO),IO调用完成后OS返回一个通知给用户程序, 当然这需要OS的充分支持才能发挥最高的性能.


extra

关于同步/异步/阻塞/非阻塞, 可以参考这一篇文章: https://www.cnblogs.com/mhq-martin/p/9035640.html

同步/异步/阻塞/非阻塞 总结:

  • 等待消息到来的时候是: 阻塞/非阻塞
  • 处理消息的时候是: 同步/异步



NIO Reactor 线程模型(事实上 Netty 的线程模型跟下面的是一模一样的)

  • 单线程模型

    • 接收客户端 和 处理操作 是同一个线程, 当操作过多的时候, 会无法接收新的连接

  • 多线程模型

    • 一个接收线程, 一个线程池处理客户端具体的业务操作, 能满足绝大部分服务器的需求, 一般这个用得最多

  • 主从多线程模型

    • 一个线程池接收客户端连接, 一个线程池处理客户端的操作, 这种一般适用于 客户端连接非常大(几百万+) 并且 需要对请求连接进行权限校验等多重过滤的场景


    extra

    关于 NIO 的 Reactor 线程模型, Doug Lea 早已经写了一篇东西(上面几张图的来源).

    传送门: http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf


关于NIO API的使用, 这里就不赘述了, 相信用 Netty 的同学都用过 NIO .

引用链接:

猜你喜欢

转载自www.cnblogs.com/wuhaonan/p/11313295.html