1. 传统 I / O 模型
2.Reactor 模式
3. 单 Reactor 单线程
4. 单 Reactor 多线程
5. 主从 Reactor 多线程
6.Reactor 模式特点总结
不同的线程模式对于性能有微小的影响,为了后续更好地发展 Netty 的线程模式,咱们先来看下各种线程模式的原理和区别,最初进行比照。
1. 传统 I / O 模型
1.1)工作原理图:
1.2)模型特点:
传统 I / O 模型也就是 BIO 模型,这在咱们后面曾经介绍过。Netty 网络编程——Netty 的根本介绍与 BIO,它的毛病有:
1)每个申请都要创立线程,浪费资源。
2)连贯建设后,如果服务端的数据还没有筹备好,则服务端线程不会去解决别的申请,会 阻塞,造成资源节约。
2.Reactor 模式
针对传统 I / O 模型的毛病,咱们有 如下的解决方案:
1)基于多路复用,一个线程解决多个客户端连贯。
2)业务逻辑解决线程基于线程池,一个线程能够解决多个连贯的业务。
Reactor 模式原理图:
咱们从图中能够得出,
1)服务器端程序处理传进来的多个申请,并将他们分派给对应的解决线程,咱们称之为 Reactor(反应堆)模式。
2)Reactor 采纳 IO 多路复用,一个 Handler 解决多个客户端连贯,解决线程结束后,会通过 Handler 返回对应的客户端。
咱们能够得出 Reactor 里有 两个角色 :
ServiceHandler: 负责监听和散发事件,分发给适当的线程来对业务逻辑进行解决。
EventHandler:解决申请的理论线程。
Reactor 模式还分为三种:
单 Reactor 单线程 , 单 Reactor 多线程,主从 Reactor 多线程,咱们来顺次进行解说。
3. 单 Reactor 单线程
原理图:
解决逻辑:
1)当有 client 申请的时候,咱们 通过 select 进行 I / O 多路复用解决申请 。
2)Reactor 通过 select 监听客户端事件, 通过 dispatch 来转发申请 。
3) 如果是建设连贯的申请 ,咱们应用 Acceptor 通过 accept 解决申请。
4) 如果是不是建设连贯申请 ,Reactor 则会 调用对应的 Handler 解决。
总结:
服务器端用一个线程实现所有客户端的 IO 操作,模型简略易懂。
优缺点剖析:
长处:
1)简略,没有线程竞争,全副都由一个线程实现。
毛病:
1)性能不佳 ,一个线程要解决这么多申请,当 Handler 正在进行 I / O 密集型的操作时,整个 Reactor 无奈解决其它事件。
2) 高度耦合性,导致线程出现异常的时候,会导致整个模块不可用。
4. 单 Reactor 多线程
原理图:
解决逻辑:
1)通过 Reactor 中的 select 解决所有连贯申请。
2)通过 Reactor 中的dispatch 来散发申请。
3)通过Acceptor 来解决连贯。
4)通过 不同的 handler 来解决不同的解决申请,然而不做具体解决,而是通过 send 发送给线程池。
5)worker 线程业务处理完毕后,将后果返回 handler。
优缺点剖析:
长处 :相比单线程模式, 更能施展 cpu 的能力。
毛病 : 建设连贯的线程还是只有一个,在连接数多的状况下,容易呈现瓶颈。
5. 主从 Reactor 多线程
针对单 Reactor 中的连接数过大造成的瓶颈,能够让 Reactor 在多线程中进行运行。
原理图:
解决逻辑:
1)MainReactor 主线程通过 select 解决多个连贯申请,以及解决建设连贯的逻辑。
2)MainReactor承受到处理事件后 ,把 事件分发给 Reactor 子线程。
3)SubReactor 将 连贯退出到连贯队列进行监听,并依据事件创立不同的 handler
4)handler 将对应的事件分发给 worker 线程进行解决。
5)返回后果
6)Reactor 主线程能够对应多个 Reactor 子线程。
优缺点剖析:
长处 :
1) 父子线程职责明确 ,父线程只须要建设连贯,子线程解决业务逻辑
2) 父子线程只须要进行转发即可,交互简略。
毛病 :
1) 编程复杂度高。
6.Reactor 模式特点总结
1)响应快 ,不用为某个长时间解决的业务进行阻塞期待。
2) 分工明确 ,各自的线程解决各自的逻辑,繁多职责。
3) 扩展性好 ,主须要减少不同的 Handler 就能够解决不同的工作,还不必批改原来的代码。
4) 复用性好 ,Reactor 与具体的逻辑无关,具备很高的复用性。
5) 防止简单的多线程的切换开销。