美文网首页
Netty学习(一)NIO介绍

Netty学习(一)NIO介绍

作者: 疾风老头 | 来源:发表于2019-08-21 18:24 被阅读0次

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 在 linux 下是基于 epoll 的多路复用来实现的, 一个线程可以处理多个通道(连接)事件, 线程数量往往不会很多, 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 的线程模型跟下面的是一模一样的)

  • 单线程模型

    • 一个接收线程, 一个处理读写的线程, 当操作过多的时候, 会无法接收新的连接

      image
  • 多线程模型

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

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

      image

    extra

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

    传送门:

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

引用链接:

相关文章

网友评论

      本文标题:Netty学习(一)NIO介绍

      本文链接:https://www.haomeiwen.com/subject/zpwisctx.html