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)防止简单的多线程的切换开销。