目前存在的线程模型有:
传统的堵塞I/O服务模型
Reactor模式
一,传统堵塞I/O线程模型
模型特点:
问题分析:
二,Reactor模式
Reactor本质是基于NIO模型上的一种方法论,优化了传统的NIO架构,在NIO基础上在建立一套框架,netty就源于这套Reactor框架模式
针对传统的堵塞I/O服务模型的2个缺点,解决方案:
1,基于I/O复用模型:多个连接共用一个堵塞对象,应用程序只需要在一个堵塞对象等待,无需堵塞等待的所有连接,当某个连接有新的数据可以处理,操作系统通知应用程序,线程从堵塞状态返回,开始进行业务处理
2,基于线程池复用线程资源:不必再为每一个连接创建线程,将连接完成后的业务处理任务分配给线程池进行处理,一个线程可以处理多个连接的业务
注:I/O复用模式是基于NIO的selector的多路复用器原理,在Reactor模式中I/O复用做了增强,Reactor其实也是基于NIO模型,在Reactor中I/O复用模式又叫1,反应器模式 2,分发者模式 3,通知者模式
I/O复用结合连接池,就是Reactor模式基本设计思想:
Reactor模式,通过一个或者多个输入同时传递给服务处理器的模式(事件驱动型)
服务器端程序处理传入的多个请求并将它们同步分派到相应的线程进行处理,集中调度分别处理,因此reactor模式也叫Dispatcher模式
Reactor模式的核心组成部分:
Reactor模式的分类:
单Reactor单线程模型
多Reactor多线程模型
主从Reactor多线程模型(netty基础)
注:Netty的线程模式主要是基于Reactor多线程模型并做了一定改进
三种模式的理解(以培训机构为例):
单Reactor单线程:课程的销售和讲师是同一个人
单Reactor多线程:有一个课程销售,但有多个讲师
主从Reactor多线程:多个课程销售,多个讲师
Reactor具备的优点:
响应快:不必为单个同步事件所堵塞,虽然Reactor本身依旧是同步
拓展性好:可以方便的通过增加Reactor实例个数来充分利用CUP资源
复用性好:Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性
可以最大程度的避免复杂线程及同步问题,并且避免了多线程、进程的切换开销
一,单Reactor单线程模型
模型说明:
select是NIO中多路复用模型,可以实现应用程序通过一个堵塞对象监听多路连接
Reactor对象通过select监控客户端请求事件,收到事件后通过Dispatcher进行
Reactor如果接收的是连接请求,就调用Acceptor处理连接请求然后创建一个Handler对象处理连接完成后的后续业务处理
如果非连接请求事件,则Reactor会分发调用连接对应的Handler来响应
Handler会完成Read(读取数据或者请求) -> 业务处理 -> Send(回送处理完成数据)的业务流程
方案优缺点分析:
优点:模型简单,编码轻便,没有多线程,进程通信,竞争的问题全部在一个线程中完成
缺点:
使用场景:客户端的数量有限,使用场景有限
二,单Reactor多线程模型
模型说明:
Reactor通过Select监控客户端请求事件,收到事件后,通过dispatcher进行分发
如果是建立请求,则调用Acceptor模块,处理连接请求,并创建一个相应的Handler来处理请求
如果不是连接请求,则会由Reactor分发调用Handler处理
多线程的Handler只有Read和Send并不处理实际业务,Read负责读取请求数据,Send将请求分发到Worker线程池中的线程处理实际业务
Worker将实际业务处理完成,将处理结果回送到Handler
Handler再通过Send回送到客户端
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109