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
关于同步/异步/阻塞/非阻塞, 可以参考这一篇文章:
同步/异步/阻塞/非阻塞 总结:
- 等待消息到来的时候是: 阻塞/非阻塞
- 处理消息的时候是: 同步/异步
NIO Reactor 线程模型(事实上 Netty 的线程模型跟下面的是一模一样的)
-
单线程模型
-
一个接收线程, 一个处理读写的线程, 当操作过多的时候, 会无法接收新的连接
image
-
-
多线程模型
- 一个接收线程, 一个线程池处理客户端具体的业务操作, 能满足绝大部分服务器的需求, 一般这个用得最多

-
主从多线程模型
-
一个线程池接收客户端连接, 一个线程池处理客户端的操作, 这种一般适用于 客户端连接非常大(几百万+) 并且 需要对请求连接进行权限校验等多重过滤的场景
image
extra
关于 NIO 的 Reactor 线程模型, Doug Lea 早已经写了一篇东西(上面几张图的来源).
传送门:
-
引用链接:
-
同步/异步/阻塞/非阻塞:
-
NIO 、Reactor :
网友评论